链接https://www.cnblogs.com/lz0925/articles/8988922.html
原博主Eternity味道
-----------------------------------------------------------
MySQL脏读、虚读、幻读事务的特性
- 原子性指处于同一个事务中的多条语句是不可分割的。
- 一致性事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账转账前两个账户余额之和为2k转账之后也应该是2K。
- 隔离性指多线程环境下一个线程中的事务不能被其他线程中的事务打扰
- 持久性事务一旦提交就应该被永久保存起来。
事务隔离性问题 如果不考虑事务的隔离性会出现以下问题
- 脏读指一个线程中的事务读取到了另外一个线程中未提交的数据。
- 不可重复读虚读指一个线程中的事务读取到了另外一个线程中提交的update的数据。
- 幻读指一个线程中的事务读取到了另外一个线程中提交的insert的数据。
隔离级别
隔离级别脏读Dirty Read不可重复读NonRepeatable Read幻读Phantom Read未提交读Read uncommitted可能可能可能已提交读Read committed不可能可能可能可重复读Repeatable read不可能不可能可能可串行化Serializable 不可能不可能不可能级别越高数据越安全但性能越低。
不可重复读与幻读比较相似都是在一个事务中多次读取到不同的数据。
网络上的总结如下 1.不可重复读所谓的虚读也就是大家经常说的不可重复读是指在数据库访问中一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据事务T2读取并修改了该数据T1为了对读取值进行检验而再次读取该数据便得到了不同的结果。 一种更易理解的说法是在一个事务内多次读同一个数据。在这个事务还没有结束时另 一个事务也访问该同一数据。那么在第一个事务的两次读数据之间。由于第二个事务的修改那么第一个事务读到的数据可能不一样这样就发生了在一个事务内 两次读到的数据是不一样的因此称为不可重复读即原始读取不可重复。 转载者添加范围锁即可
2.所谓幻读是指事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集然后再提交。 幻读是指当事务不是独立执行时发生的一种现象例如第一个事务对一个表中的数据进行了修改比如这种修改涉及到表中的“全部数据行”。同时第二个事务也 修改这个表中的数据这种修改是向表中插入“一行新数据”。那么以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行就好象发生了幻觉一 样.一般解决幻读的方法是增加范围锁RangeS锁定检锁范围为只读这样就避免了幻读。简单来说幻读是由插入或者删除引起的。转载者应该只能锁表否则无法解决插入满足查询条件的情况
大致的区别在于不可重复读是由于另一个事务对数据的更改所造成的而幻读是由于另一个事务插入或删除引起的。
3.不可重复读虚读和幻读的差别 从总的结果来看, 似乎两者都表现为两次读取的结果不一致. 但如果你从控制的角度来看, 两者的区别就比较大 对于前者, 只需要锁住满足条件的记录 对于后者, 要锁住满足条件及其相近的记录