第1章 MySQL 架构于历史

MySQL 逻辑架构

并发控制

读写锁

从邮箱中读取数据没有这样的麻烦,因为即使同一时刻有多个用户并发并发读取也不会有什么问题。因为读取不会修改数据,所以不会出错。在处理并发读或者写时,可以通过由两种类型的锁组成的系统来解决问题,这两种类型的锁通常被称为共享锁排他锁,也叫读锁写锁。读锁是共享的,也就是说一个客户获得读锁,其他的客户也会获得。写锁是排他的,也就是说,一个写锁会阻塞其他的写锁和读锁。

锁粒度

尽量只锁定需要修改的部分数据,而不是所有的资源。只对会修改的数据片进行精确的锁定。在任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高。所谓锁策略,就是在锁的开销和数据的安全之间寻求平衡,这种平衡当然也会影响到性能。

表锁

表锁(table lock)是 MySQL 中最基本的锁策略,并且是开销最小的策略。表锁会锁定整张表,一个用户在对表进行写操作前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。

行级锁

行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销)。

事务

事务就是一组原子性的 SQL 查询,或者说一个独立的工作单元。事务内的语句,要么全部执行,要么全部执行失败。
事务的 ACID特性表示原子性、一致性、隔离性和持久性。一个运行良好的事务处理系统,必须具备这些标准特性。

  • 原子性
    一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
  • 一致性
  • 隔离性
    通常来说,一个事务所作的修改在最终提交前,对其他事务是不可见的。
  • 持久性
    一旦事务提交,其所做的修改就会永久保存在数据库当中。

隔离级别

在 SQL 标准中定义了四种隔离级别,每一种级别中都规定了一个事务中所作的修改,那些在事务内和事务间是可见的,那些是不可见的。较低级别的隔离通常可以执行更高的并发,系统开销也更低。
四种隔离级别

  • READ UNCOMMITTED(未提交读)
    在 READ UNCOMMITTED 级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也称为脏读(dirty read)。

  • READ COMMITTED(提交读)
    大多数数据库系统默认的隔离级别都是 READ COMMITTED(但 MySQL 不是)。它满足前面提到的隔离性的简单定义:一个事务开始时,只能看见已经提交的事务所作的修改。换句话说,一个事务从开始直到提交之前,所作的任何修改对其他事务都是不可见的。这个级别有时也叫不可重复读。

  • REPEATABLE READ(可重复读)
    可重复读是 MySQL 的默认事务隔离级别。

  • SERIALIZABLE(可串行化)
    SERIALIZABLE 是最高的隔离级别。它通过强制事务串行执行,避免了前面提到的幻读问题。SERIALIABLE 会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用问题。

MySQL 的存储引擎

InnoDB 是 MySQL 的默认事务型引擎,也是最重要,使用最广泛的存储引擎。他被设计用来处理大量的短期事务,短期事务大部分情况是正常提交的,很少会被回滚。

猜你喜欢

转载自blog.csdn.net/qq_32682177/article/details/85000717