事务的四大特性(ACID):
- 原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作
- 一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。
- 隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。
- 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
原子性通过redo log的WAL机制实现
事务的特性——原子性
事务的特性——持久性
如何做到持久性:
- 通过原子性可以保证逻辑上的持久性
- 通过存储引擎的数据刷盘可以保证物理上的持久性
- 这个过程与redo log、事务标记、binlog补充、innodb_flush_log_at_trx_commit、数据恢复有关
事务的特性——隔离性
- 通常用read view表示一个事务的可见性
- RC级别的事务可见性比较高,可以看到已提交的事务的所有修改
- RR级别的事务没有这个功能,只要自己不提交,查询的数据结果就不会变
可串行化:
实际上并不是MVCC机制
事务的特性——一致性
MVCC多版本并发控制
- InnoDB存储引擎,实现的是基于多版本的并发控制协议MVCC
- MVCC最大的好处是读不加锁,读写不冲突,极大的增加了系统的并发性
- 现阶段几乎所有的RDBMS都支持MVCC,因为并发性高
- 在MVCC多版本并发控制中,读操作可分为两类:快照读snapshot read、当前读current read
- MVCC只在ReadCommited和RepeatableRead两个隔离级别下工作
快照读:读取的记录和可见版本有可能是历史版本,不用加锁
当前读:读取的记录是最新版本,并且返回的记录都会加锁,保证其他事务不会并发修改此事务
隐含ID(DB_ROW_ID):6字节,由InnoDB自动产生
事务ID(DB_TRX_ID): 6字节,标记了最新更新这条记录的TransactionID,每处理一条事务,该值+1
回滚指针(DB_ROLL_PT):7字节,指向当前记录项的rollback segment的undo记录,找到之前版本的记录
并发事务带来的问题:
脏读:读取到未提交的修改
幻读:读取到提交的修改(间隙锁:Gap Lock解决幻读)
不可重复度:每次读取的记录不一致