关于脏读、不可重复读与幻读
脏读
指是否能够读取到其他事务未提交的数据。如果能读取到,则称为脏读。
不可重复读
相对于某个已经开始的事务而言,该事务对某个数据的多次读取是否与事务开始时读取到的值一致。如果该事务多次读取某个数据时都能读取到相同的值,则称为可重复读;否则称为不可重复读。
幻读
相对于某个已经开始的事务而言,出现的场景是在事务中需要对某个数据进行读取,并以此为基础对该数据进行修改(修改指新增行、删除行、修改值等)。举个例子:
同时存在两个事务:事务A和事务B。事务A负责将变量a=1逐步递增到10,与此同时,事务B读取到a=1。在事务B读取到a的值之后,发起了一个修改操作 ” update a = 11 where a = 1 ",此时事务B尚未提交。然后事务B在事务A提交之后执行提交,此时发现得到结果 affect rows = 0,修改操作失败。这就好像感觉之前读取数据时发生了幻觉一样,人家数据是10,我看成了1,少看了一个0?
四个事务隔离级别
读未提交
读已提交
可重复读
串行化
串行化是最严格的事务隔离级别,事务只能一个接一个地执行,不能并发执行。如同时存在事务A,事务B,事务C,那么必须按照一定的顺序,如事务A => 事务B => 事务C 依次执行。
主要内容总结
事务隔离性,是指在并发环境中,不同事务并发操作相同的数据时,每个事务都有各自完整的数据空间,并发执行的各个事务之间不能相互影响。
在标准SQL规范中定义了四个事务隔离级别,其分别是:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
串行化 | × | × | × |
如果我的文章对你有帮助,欢迎你关注我的微信公众号,如有错误,也请指出。你的关注是我写作的动力。(PS:公众号已更名为 “洮渚的进阶札记” 2020-8-1凌晨生效)