事物基本要素
- 原子性:事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态
- 一致性:事务开始前和结束后,数据库的完整性约束没有被破坏
- 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰
- 持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚
概念说明
脏读
a读到了b更新的数据,然后b回滚,那么a读到的数据将是不存在的数据,即脏数据
不可重复读
a对一个数据进行多次读取,b在a进行多次读取过程中,对该数据进行了更新并且提交,使得a多次读取统一数据得到的结果不同
幻读
a按照一定条件对数据进行读取,在此期间b插入了一条相同条件的新数据。a再次按照相同条件进行数据读取,发现了新数据
事物隔离级别
读未提交
如果一个事务读到了另一个未提交事务修改过的数据,那么这种隔离级别就称之为未提交读
读提交
如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那么这种隔离级别就称之为已提交读
可重复读
在一些业务场景中,一个事务只能读到另一个已经提交的事务修改过的数据,但是第一次读过某条记录后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种隔离级别就称之为可重复读
串行化
串行化就很容易理解了。
本文最后四张图片参考自wust_zwl的MySQL事务隔离级别和MVCC (绝对看得懂),大家可以参考原文,原文内容更加深刻!!