文章目录
- 一、事务(提出事务)
- 二、四个特性(事务要实现的特性)
- 三、一致性问题(事务可以解决这些问题)
- 四、解决(事务解决部分或全部一致性问题)
- 五、实现(事务实现ACID的机制)
学习视频:事务与隔离级别
学习视频:MVCC机制
一、事务(提出事务)
事务只是一个改变,是一些操作的集合,用专业的术语讲,他就是一个程序的执行单元。事务本身其实并不包含ACID这四个特性,我们需要通过某些手段,尽可能的让这个执行单元满足这四个特性,我们就可以称它为一个事务,或者说一个正确的事务,完美的事务。
总的来说:事务是通过某些机制实现ACID特性的操作集合。
二、四个特性(事务要实现的特性)
- 原子性:满足原子操作单元,对数据的操作,要么全部执行,要么全部失败
- 一致性:事务的开始合完成,数据都必须保持一致
- 隔离性:事务之间是相互独立的,中间状态对外不可见
- 持久性:数据的修改是永久的
三、一致性问题(事务可以解决这些问题)
1. 修改丢失
丢失修改指一个事务的更新操作被另外一个事务的更新操作替换。一般在现实生活中常会遇到,例如:T1 和 T2 两个事务都对一个数据进行修改,T1 先修改并提交生效,T2 随后修改,T2 的修改覆盖了 T1 的修改。
2. 读脏数据
读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。例如:T1 修改一个数据但未提交,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
3. 不可重复读
不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取的数据可能不一致。例如:T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
4. 幻影读
幻读本质上也属于不可重复读的情况,T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
四、解决(事务解决部分或全部一致性问题)
为了权衡【隔离】和【并发】的矛盾,ISO定义了四个事务的隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同。
- 未提交读:最低级别,只能保证持久性
- 已提交读:语句级别
- 可重复读:事务级别
- 串行化:最高级别,事务与事务完全串行化执行,毫无并发可言,性能极低
五、实现(事务实现ACID的机制)
1. 锁机制:阻止其他事务对数据进行操作,各个隔离级别主要体现在读取数据时加的锁和释放锁的时机
- RU:事务读取的时候,不加锁
- RC:事务读取的时候加行级锁(读到才加锁),一旦读完立即释放(并不是事务结束)
- RR:事务读取时加行级锁(读到才加锁),直到事务结束才会释放
- SE:事务读取时加表级锁,直到事务结束时,才会释放
2. MVCC机制:生成一个数据快照,并用这个快照来提供一定级别的一致性的读取,也称为多版本数据控制(读取事务第一次版本的记录版本链的数据)
- 实际就是CAS版本控制和读写分离的思想
- 主要作用于RC和RR级别