image.png

事务的四大特性(ACID):

  • 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作
  • 一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。
  • 隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  • 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

image.png
image.png
原子性通过redo log的WAL机制实现

事务的特性——原子性

image.png

事务的特性——持久性

image.png

如何做到持久性:

  • 通过原子性可以保证逻辑上的持久性
  • 通过存储引擎的数据刷盘可以保证物理上的持久性
  • 这个过程与redo log、事务标记、binlog补充、innodb_flush_log_at_trx_commit、数据恢复有关


事务的特性——隔离性

image.png

  • 通常用read view表示一个事务的可见性
  • RC级别的事务可见性比较高,可以看到已提交的事务的所有修改
  • RR级别的事务没有这个功能,只要自己不提交,查询的数据结果就不会变

image.png

可串行化:

image.png
实际上并不是MVCC机制

事务的特性——一致性

image.png

MVCC多版本并发控制

  • InnoDB存储引擎,实现的是基于多版本的并发控制协议MVCC
  • MVCC最大的好处是读不加锁,读写不冲突,极大的增加了系统的并发性
  • 现阶段几乎所有的RDBMS都支持MVCC,因为并发性高
  • 在MVCC多版本并发控制中,读操作可分为两类:快照读snapshot read、当前读current read
  • MVCC只在ReadCommitedRepeatableRead两个隔离级别下工作

快照读:读取的记录和可见版本有可能是历史版本,不用加锁
当前读:读取的记录是最新版本,并且返回的记录都会加锁,保证其他事务不会并发修改此事务
image.png
image.png
image.png
image.png
隐含ID(DB_ROW_ID):6字节,由InnoDB自动产生
事务ID(DB_TRX_ID): 6字节,标记了最新更新这条记录的TransactionID,每处理一条事务,该值+1
回滚指针(DB_ROLL_PT):7字节,指向当前记录项的rollback segment的undo记录,找到之前版本的记录

并发事务带来的问题:

image.png
脏读:读取到未提交的修改
幻读:读取到提交的修改(间隙锁:Gap Lock解决幻读)
不可重复度:每次读取的记录不一致

解决办法:

image.png