MySQL 详解

  1. 基础知识

    • 你能解释一下什么是数据库和数据库管理系统(DBMS)吗?

    • 你能描述一下MySQL是什么,以及它与其他数据库(例如PostgreSQL、Oracle等)有何不同吗?

    • 你能解释一下什么是SQL吗?能举几个常用的SQL语句的例子吗?

  2. 数据库设计

    • 你能解释一下什么是数据表、行和列吗?

    • 你能解释一下什么是主键和外键吗?它们在数据库设计中的作用是什么?

    • 你能描述一下什么是数据库的规范化吗?能举一个例子说明规范化如何改善数据库设计吗?

  3. SQL查询和操作

    • 你能解释一下什么是SQL的SELECT、INSERT、UPDATE和DELETE语句吗?能写出它们的示例吗?

    • 你知道如何使用JOIN操作吗?你能解释一下INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN的区别吗?

    • 你能解释一下什么是子查询吗?能举一个例子吗?

  4. 高级主题

    • 你知道如何创建和使用存储过程、视图和触发器吗?

    • 你了解事务处理和ACID属性吗?

    • 你了解数据库的索引和优化吗?你能解释一下什么情况下需要创建索引吗?

  5. MySQL特有的主题

    • 你能解释一下MySQL的存储引擎,例如MyISAM和InnoDB的区别吗?

    • 你了解MySQL的复制和分区吗?

    • 你有使用MySQL进行性能优化的经验吗?能分享一下你的经验吗?

    • 补充-“脏读(Dirty Read)”、”不可重复读(Nonrepeatable Read)”和”幻读(Phantom Read)

基础知识

什么是数据库和数据库管理系统(DBMS)?

数据库(Database): 数据库是一个有组织的数据集合。它可以是简单的文本文件,也可以是复杂的分布式数据库系统,具体取决于数据的类型和应用需求。数据库可以包含各种类型的数据,包括文本、数字、图片、视频等。数据库的目标是提供一种方式来存储和检索数据,使得数据的使用和管理变得更加容易。

数据库管理系统(DBMS): 数据库管理系统是一种用来创建和管理数据库的软件。DBMS提供了一套工具和接口,帮助开发者和管理员存储、检索、更新和管理在数据库中的数据。DBMS可以帮助处理许多与数据管理相关的问题,如并发控制、数据一致性、安全性和备份/恢复等。

DBMS可以分为几种类型,包括关系数据库管理系统(RDBMS),如MySQL、Oracle和PostgreSQL;非关系数据库管理系统(NoSQL),如MongoDB和Cassandra;以及新兴的NewSQL数据库,如CockroachDB和TiDB等。

关系数据库管理系统(RDBMS)使用结构化查询语言(SQL)来定义和操作数据。SQL是一种声明性语言,用户只需要声明他们想要什么数据,而不需要指定如何获取这些数据。这使得RDBMS非常灵活且易于使用。

非关系数据库(NoSQL)不依赖于传统的SQL语言和数据模型,而是提供了各种其他的数据模型,如键值对、文档、列族和图等。这使得NoSQL数据库更适合处理大规模、非结构化的数据。

NewSQL数据库试图结合关系数据库的ACID属性(原子性、一致性、隔离性、持久性)和NoSQL数据库的水平扩展性。这使得NewSQL数据库既可以处理复杂的事务,也可以处理大规模的数据。

MySQL是什么,以及它与其他数据库(例如PostgreSQL、Oracle等)有何不同?

MySQL是一个关系数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现在属于甲骨文(Oracle)公司。MySQL是开源的,所以任何人都可以使用。它的主要编程语言是C和C++,并使用结构化查询语言(SQL)作为其查询界面。MySQL被广泛应用于许多网页应用软件中,常常配合Apache网页服务器,PHP和Perl语言一起使用。

MySQL和其他数据库(例如PostgreSQL、Oracle)之间存在一些差异:

  1. 开源与商业:MySQL是开源数据库,对于许多用途,都可以免费使用。PostgreSQL也是完全开源的。而Oracle数据库是商业数据库,需要付费使用,特别是在大型企业级应用中。

  2. 性能和特性:MySQL注重易用性和速度,它在读取操作上表现很好,是很多Web应用的首选。PostgreSQL的特性更为丰富,例如它支持物化视图、同步复制等特性。Oracle数据库则以其高级特性、数据一致性和健壮性而闻名,特别是在大型企业环境中。

  3. SQL标准和兼容性:PostgreSQL非常严格地遵循SQL标准,并提供了许多扩展和额外的功能。MySQL则对SQL标准采取了更灵活的态度,它有自己的一些扩展和变体。Oracle数据库也提供了许多专有的特性和扩展。

  4. 社区与支持:MySQL和PostgreSQL都有活跃的开源社区,而Oracle则提供专业的商业支持。

选择哪种数据库取决于你的具体需求,包括你的数据量、事务类型、预算、性能需求、特性需求等。

什么是SQL吗?能举几个常用的SQL语句的例子。

SQL(结构化查询语言,Structured Query Language)是一种用于管理和操作关系型数据库的标准语言。使用SQL,你可以创建、修改、查询和删除数据库中的数据,以及对数据库的结构进行操作。

以下是一些常见的SQL语句示例:

  1. SELECT:用于从数据库中选取数据。比如,如果我们有一个名为 “employees” 的表,我们可以使用以下命令来选取所有的员工姓名:
    SELECT name FROM employees;
  2. INSERT INTO:用于向数据库表中插入新的行。比如,我们可以使用以下命令向 “employees” 表中添加一个新的员工:
    INSERT INTO employees (name, position) VALUES ('John Doe', 'Software Engineer');
  3. UPDATE:用于修改数据库表中的数据。比如,我们可以使用以下命令来更新 “employees” 表中名为 ‘John Doe’ 的员工的职位:
    UPDATE employees SET position = 'Senior Software Engineer' WHERE name = 'John Doe';
  4. DELETE:用于从数据库表中删除行。比如,我们可以使用以下命令来删除 “employees” 表中名为 ‘John Doe’ 的员工:
    DELETE FROM employees WHERE name = 'John Doe';
  5. CREATE TABLE:用于创建新的数据库表。比如,我们可以使用以下命令来创建一个新的 “departments” 表:
    CREATE TABLE departments (
     id INT PRIMARY KEY,
     name VARCHAR(50)
    );
  6. DROP TABLE:用于删除整个数据库表。比如,我们可以使用以下命令来删除 “departments” 表:
    DROP TABLE departments;
    这只是SQL的一部分功能,更复杂的查询和操作可以通过组合不同的SQL语句和子句来实现。

数据库设计

什么是数据表、行和列?

在关系数据库中,数据被组织成一个或多个数据表,每个表包含行和列。

数据表(Table): 数据表是数据库中的一个结构,其中存储着相关的数据。你可以把它想象成一个电子表格。例如,一个”employees”的数据表可能会存储一个公司所有员工的信息。

行(Row): 在数据表中,行代表一条单独的、具体的记录。继续以上面的”employees”表为例,一行可能代表一个特定的员工,包括他们的姓名、职位、工资等信息。

列(Column): 列在数据表中定义了某种类型的数据。在”employees”表中,可能有一个名为”name”的列用于存储员工的姓名,一个名为”position”的列用于存储员工的职位,一个名为”salary”的列用于存储员工的工资等等。

一起看的话,你可以想象一个数据表就像一个网格,其中每一行代表一条记录,每一列代表一个数据字段。这种结构使得在表中查找、排序、过滤和组合数据变得很容易。

什么是主键和外键?它们在数据库设计中的作用是什么?

主键(Primary Key)外键(Foreign Key) 是关系型数据库中两个非常重要的概念。

主键是一个或一组列,它的值能唯一标识表中的每一行。主键的作用是提供一种快速并且可靠的方法来识别每一条记录,它也可以帮助组织数据的存储。主键的值必须是唯一的,并且不能是NULL。例如,在一个员工表中,可能会使用员工ID作为主键。

外键是一个或一组列,它的值是另一个表的主键的引用。外键的作用是强制实施所谓的引用完整性。如果一个表的一列包含另一个表的主键值,那么该列只能包含主键表中实际存在的值。这确保了数据库中的关联信息的一致性和正确性。例如,在一个订单表中,可能会使用员工ID作为外键,来表示这个订单是由哪个员工处理的。

主键和外键是实现关系型数据库中的关系模型的重要部分。主键用于标识记录,使得我们可以直接访问和操作记录;而外键用于链接两个表,使得我们可以查询和理解表之间的关系。

什么是数据库的规范化?举一个例子说明规范化如何改善数据库设计。

数据库规范化是一个设计过程,其主要目标是减少数据冗余,同时保证数据的一致性。规范化涉及将一个数据库的架构分解为两个或更多个相关表。规范化过程通常分为几个级别,称为”规范化形式”,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等。

规范化的主要优点包括:

  • 减少数据冗余:数据冗余可能导致存储空间浪费以及数据一致性问题。通过规范化,可以避免冗余数据的存储。

  • 保持数据一致性:如果一个数据在多个地方存储,那么在更新数据时可能会出现一致性问题。规范化可以确保每个数据只在一个地方存储,从而保持数据的一致性。

  • 简化数据操作:规范化可以使得数据的插入、删除和修改操作更加简单。

举个例子,假设我们有一个记录公司所有员工和部门信息的表,表中包含员工姓名、员工地址、部门名称和部门经理等字段。这个表可能会有很多冗余数据,因为同一个部门的多个员工会有相同的部门名称和部门经理。

通过规范化,我们可以将这个表分解为两个表:一个员工表(包含员工姓名和地址,以及一个部门ID)和一个部门表(包含部门ID、部门名称和部门经理)。这样,每个部门的信息只在部门表中存储一次,而不是在每个员工的记录中都存储一遍。这样就减少了数据冗余,提高了数据的一致性,并简化了数据操作。

SQL查询和操作

什么是SQL的SELECT、INSERT、UPDATE和DELETE语句吗?写出它们的示例。

  1. SELECT:SELECT语句用于从数据库表中查询(选择)数据。例如,以下的SQL语句会从名为employees的表中选择所有的员工名字(name)和职位(position):
    SELECT name, position FROM employees;
    如果你想选择表中的所有列,你可以使用*符号,如下:
    SELECT * FROM employees;
  2. INSERT INTO:INSERT INTO语句用于向数据库表中插入新的数据行。例如,以下的SQL语句会在employees表中插入一行新的员工数据:
    INSERT INTO employees (name, position, salary) 
    VALUES ('John Doe', 'Software Engineer', 70000);
  3. UPDATE:UPDATE语句用于更新数据库表中已存在的数据行。例如,以下的SQL语句会将名为’John Doe’的员工的职位更新为’Senior Software Engineer’:
    UPDATE employees 
    SET position = 'Senior Software Engineer' 
    WHERE name = 'John Doe';
  4. DELETE:DELETE语句用于从数据库表中删除数据行。例如,以下的SQL语句会删除employees表中所有名为’John Doe’的员工:
    DELETE FROM employees WHERE name = 'John Doe';
    注意:如果你不提供WHERE条件,DELETE语句会删除表中的所有行。请谨慎使用。

每一种语句都有很多可能的变化和选项,你可以根据你的需求来定制你的SQL查询。

如何使用JOIN操作吗?解释一下INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN的区别。

JOIN操作是在SQL中将两个或多个表中的行组合起来的方法,主要是基于这些表之间的共同列。

下面是四种类型的JOIN操作的简单解释:

  1. INNER JOIN:INNER JOIN返回两个表中都有的记录。例如,如果一个表有A、B、C三个记录,另一个表有B、C、D三个记录,那么INNER JOIN的结果将包括B和C这两个共享的记录。

  2. LEFT JOIN(或LEFT OUTER JOIN):LEFT JOIN返回左表中的所有记录和右表中匹配的记录。如果没有匹配,结果是NULL。在上述的例子中,LEFT JOIN的结果将包括A、B和C。

  3. RIGHT JOIN(或RIGHT OUTER JOIN):RIGHT JOIN返回右表中的所有记录和左表中匹配的记录。如果没有匹配,结果是NULL。在上述的例子中,RIGHT JOIN的结果将包括B、C和D。

  4. FULL JOIN(或FULL OUTER JOIN):FULL JOIN返回当左表和右表的记录有匹配时的所有记录。当没有匹配时,它也返回左表和右表的所有记录,此时没有匹配的部分将为NULL。在上述的例子中,FULL JOIN的结果将包括A、B、C和D。

下面是一个INNER JOIN的例子,它返回在employees表和departments表中都存在的记录:

SELECT employees.name, employees.department_id, departments.department_name 
FROM employees 
INNER JOIN departments 
ON employees.department_id = departments.department_id;

在这个例子中,employees.department_id = departments.department_id是连接条件,它指定了如何匹配employees表和departments表中的记录。返回的结果将包括每个员工的姓名、部门ID和部门名称,但只有在员工的部门ID在departments表中存在的员工才会被包括在内。

什么是子查询吗?举一个例子。

子查询,又被称为内部查询或嵌套查询,是嵌入在另一个SQL查询中的查询。子查询可以嵌入在SELECT、INSERT、UPDATE,DELETE语句,或者另一个子查询中。子查询可以返回一个值(标量),一行,一列,或一个表。

以下是一个子查询的例子。假设我们有一个员工表(employees),里面有员工的姓名(name)、工资(salary)等信息。我们想找出工资高于平均工资的员工:

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

在这个例子中,内部的查询 (SELECT AVG(salary) FROM employees) 是一个子查询。它首先计算出员工的平均工资。然后,外部的查询使用这个平均工资来找出那些工资高于平均工资的员工。

子查询在处理复杂的问题时非常有用,尤其是当操作依赖于临时或一次性结果集时。但是,如果可能的话,使用JOIN操作通常会有更好的性能。

高级主题

如何创建和使用存储过程、视图和触发器?

  1. 存储过程(Stored Procedure):存储过程是一些预编译的SQL语句的集合,可以在数据库中创建和存储,并且可以重复使用。存储过程可以接受参数,也可以返回值。存储过程可以通过CALL语句调用。

    创建存储过程的示例:

    DELIMITER //
    CREATE PROCEDURE GetEmployeeCount(IN dept_name VARCHAR(50), OUT employee_count INT)
    BEGIN
     SELECT COUNT(*) INTO employee_count 
     FROM employees 
     WHERE department = dept_name;
    END //
    DELIMITER ;

    调用存储过程的示例:

    CALL GetEmployeeCount('Sales', @employee_count);
    SELECT @employee_count;
  2. 视图(View):视图是一个虚拟的表,基于SQL查询的结果。你可以使用视图来组织数据,特别是当基础表的结构复杂时,或者当你需要频繁运行某些查询时。

    创建视图的示例:

    CREATE VIEW EmployeeView AS
    SELECT name, position 
    FROM employees 
    WHERE position = 'Software Engineer';

    使用视图的示例:

    SELECT * FROM EmployeeView;
  3. 触发器(Trigger):触发器是一种特殊类型的存储过程,它会在数据库中指定的事件(如INSERT、UPDATE或DELETE)发生时自动执行。

    创建触发器的示例:

    DELIMITER //
    CREATE TRIGGER EmployeeSalaryChange
    BEFORE UPDATE
    ON employees FOR EACH ROW
    BEGIN
     INSERT INTO EmployeeAudit(employee_id, old_salary, new_salary)
     VALUES(OLD.id, OLD.salary, NEW.salary);
    END; //
    DELIMITER ;

    在这个例子中,触发器会在更新员工的薪水时,将变动情况记录到EmployeeAudit表中。

这些只是基础示例,实际上你可以根据需要编写更复杂的存储过程、视图和触发器

事务处理和ACID属性?

在数据库管理系统中,事务是一个或多个SQL语句组成的逻辑工作单元。事务是数据库处理的基本单位,可以是一条SQL语句,也可以是一组SQL语句。

事务处理的重要目的是为了确保数据库从一个一致的状态转换到另一个一致的状态。一致性是指数据库的完整性约束必须在事务前后保持一致。

ACID 是事务的四个基本属性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

  1. 原子性(Atomicity):原子性确保事务被视为一个不可分割的最小工作单元,事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中一部分操作。这就是所谓的“全体一致”原则。

  2. 一致性(Consistency):一致性确保事务必须使数据库从一个状态转变为另一个状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏相关数据库的数据的完整性和一致性。

  3. 隔离性(Isolation):多个事务并发访问数据库时,隔离性可以防止数据不一致。事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

  4. 持久性(Durability):一旦事务提交,则其结果就是永久的,即使数据库发生故障也无法消除。持久性是确保事务提交的更新将永远保存在数据库中。

事务处理可以确保数据库的完整性和一致性,特别是在多用户并发访问数据库和数据库系统故障的情况下

数据库的索引和优化?什么情况下需要创建索引?

数据库索引是一种数据结构,它可以帮助数据库系统更快地访问数据。索引可以提高数据检索效率,就像书的目录可以帮助我们更快地找到特定的章节一样。

当你在数据库表中创建索引时,数据库会创建一个更小的数据集,该数据集包含指向表中的每一行的指针,以及这些行中的索引列的值。因此,当你根据索引列的值查询数据时,数据库可以查找索引,而不是查找整个表,从而加快查询速度。

但是,索引并非没有代价。创建和维护索引需要消耗存储空间,同时每次插入或更新数据时,索引也需要被更新,这会消耗处理器时间。因此,是否需要创建索引以及在哪里创建索引,需要权衡查询性能的改善和这些开销。

以下是一些可能需要创建索引的情况:

  1. 在经常用于搜索条件的列上,可以加速查询。

  2. 在经常用于排序的列上,因为索引通常以排序的方式存储数据。

  3. MySQL的存储引擎,例如MyISAM和InnoDB的区别吗?在经常用于连接多个表的列上,可以加快这些表的连接速度。

  4. 在经常出现在定义了完整性约束的列上,如主键和唯一约束。

总的来说,对于查询密集型的应用,如果创建了合适的索引,那么查询性能的提升往往大于索引的开销。对于写入密集型的应用,需要更谨慎地考虑创建索引,因为每次写入都需要更新索引。

MySQL特有的主题

MySQL的存储引擎,例如MyISAM和InnoDB的区别?

MySQL数据库提供了多种存储引擎,每种存储引擎都有其特定的应用场景。最常用的两种MySQL存储引擎是MyISAM和InnoDB。

下面是这两种存储引擎的一些主要差异:

  1. 事务支持:InnoDB支持事务(ACID兼容),而MyISAM不支持。如果你需要执行复杂的事务,或者要求数据的一致性和完整性,应该选择InnoDB。

  2. 锁定级别:InnoDB支持行级锁定,而MyISAM只支持表级锁定。这意味着在高并发的读写环境中,InnoDB的性能通常优于MyISAM。

  3. 全文索引:在MySQL 5.6版本之前,只有MyISAM支持全文索引。从MySQL 5.6版本开始,InnoDB也支持全文索引。

  4. 外键:InnoDB支持外键,而MyISAM不支持。

  5. 崩溃恢复:InnoDB具有崩溃恢复功能,而MyISAM没有。如果系统崩溃,InnoDB存储引擎的恢复能力更强。

  6. 空间使用:由于InnoDB需要存储额外的信息(如事务信息和行级锁信息),所以InnoDB通常需要更多的磁盘空间和内存。

总的来说,如果你需要更高的并发性能,或者需要事务和外键等数据库特性,那么InnoDB可能是更好的选择。如果你的应用主要是读取操作,而且你需要全文索引,那么MyISAM可能是更好的选择。然而,由于InnoDB的功能和性能的改进,许多新的MySQL安装现在默认使用InnoDB存储引擎。

MySQL的复制和分区?

  1. MySQL 复制(Replication):复制是 MySQL 中一个非常重要的概念,它允许你从一个 MySQL 数据库服务器(称为主服务器,或 master)复制数据和数据库结构到一个或多个 MySQL 数据库服务器(称为从服务器,或 slave)。复制的主要目的是扩展(例如,你可以在不同的从服务器上执行不同的查询以分摊负载)和数据冗余/备份(例如,如果主服务器出现故障,你可以从一个从服务器恢复)。

  2. MySQL 分区(Partitioning):分区是数据库设计的一种技术,可以将一个大的表物理分割成多个较小的子表,这些子表称为分区。每个分区可以单独存储在文件系统上,这样就可以在物理上分散数据库的 I/O,从而提高性能。分区对于减少查询时间、优化数据存储以及管理大量数据非常有用。

    在 MySQL 中,你可以根据多种策略对表进行分区,包括按照范围、列表、哈希以及键值进行分区。例如,如果你有一个包含十年销售数据的大表,你可以按照年份范围对其进行分区,这样就可以更快地查询某一年的销售数据,因为 MySQL 只需要扫描该年份的分区,而不是整个表。

要注意的是,这两种技术有其特定的应用场景,并且可能需要相应的硬件和网络架构支持。在实际使用中,需要根据你的需求和环境进行权衡和选择。

使用MySQL进行性能优化的经验吗?分享一下你的经验?(常见的MySQL性能优化的方法和策略)

  1. 创建索引:在频繁查询的列上创建索引可以大大提高查询速度。然而,不必要的索引可以降低写入的速度并增加存储空间的使用,所以需要谨慎创建索引。

  2. 优化查询:避免在查询中使用全表扫描。你可以使用EXPLAIN语句分析查询的执行计划,看看是否可以通过修改查询或创建索引来改进查询的性能。

  3. 合理分区:对大型表进行分区可以提高查询效率,并更有效地管理数据。

  4. 使用恰当的存储引擎:不同的存储引擎有不同的优点和缺点。例如,InnoDB支持事务和行级锁定,适用于需要高并发和数据一致性的应用。

  5. 优化数据库配置:MySQL的许多配置选项可以调整以改善性能。例如,你可以增加InnoDB的缓冲池大小以适应更多的数据和索引。

  6. 定期清理和维护:定期清理旧的、不再需要的数据可以帮助保持数据库的性能。你也可以定期运行优化表命令来重新组织表的物理存储。

  7. 使用复制和读写分离:使用复制可以将读负载分散到多个从服务器上,从而提高读取性能。同时,读写分离可以保护主服务器免受大量读取请求的影响,以便主服务器可以快速处理写入请求。

以上只是一些基本的MySQL性能优化策略。在实际应用中,可能需要根据你的具体需求和环境进行更深入的优化。

补充-“脏读(Dirty Read)”、”不可重复读(Nonrepeatable Read)”和”幻读(Phantom Read)

在数据库系统中,事务并发控制的难点在于要处理各种并发问题,其中包括”脏读(Dirty Read)”、”不可重复读(Nonrepeatable Read)”和”幻读(Phantom Read)”。为了更好地理解这些概念,我会逐一解释,并举例说明。

  1. 脏读:脏读发生在一个事务读取了另一个尚未提交的事务中的数据。如果那个未提交的事务由于某种原因失败,并回滚了对数据的改变,那么第一个事务就读取了错误的数据。

    例如,假设事务1从一个账户转账100元到另一个账户,这个过程包括两步操作:从第一个账户扣款100元,然后在另一个账户上存入100元。如果在这两步操作之间,事务2读取了账户数据,就会看到一个不正确的总金额。

  2. 不可重复读:不可重复读发生在一个事务在读取某些数据后的某个时间,再次读取同样的数据,却发现数据已经被另一个已经提交的事务修改了。

    例如,一个事务读取了一个商品的库存量为100,然后进行一些操作,稍后再次读取该商品的库存量时,发现库存量变为了99,因为在此期间有另一个事务修改了这个数据。

  3. 幻读:幻读和不可重复读类似,但幻读是针对的是一批数据整体的内容。如果一个事务在读取满足某些条件的数据行的时候,另一个事务插入了满足那些条件的新的数据行,导致第一个事务在稍后再次读取那些数据行的时候,发现了”幻影”数据。

    例如,一个事务读取了所有库存量大于50的商品,稍后再次读取这些商品时,发现多了一些商品,这是因为在此期间有另一个事务新增了一些库存量大于50的商品。

在解决这些并发问题时,数据库通常提供了多种事务隔离级别,包括”读未提交(Read Uncommitted)”、”读已提交(Read Committed)”、”可重复读(Repeatable Read)”和”串行化(Serializable)”。这些隔离级别为解决上述的并发问题提供了不同的保障,但通常提供更高保障的隔离级别也会带来更大的性能开销。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!