事务的隔离级:
SQL标准定义了四种不同隔离级别,并在这四种隔离级别上分别解决:
1.Read uncommitted 能够防止更新丢失的问题
2.Read committed 解决脏读问题
3.Repeatable read 解决不可重复读问题,但是mysql在这个级别就解决了幻读
4.Serializable(可串行化) 解决幻读问题。
注:
1、mysql默认隔离级别是Repeatable read,通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)解决幻读
2、Multi-Version Concurrency Control (MVCC)
关于各种事务问题的详解:
1.更新丢失:mysql所有事务隔离级别在数据库层面都能都避免(示例如图1)
2.脏读:一个事务读到另一个事务未提交的更新数据,READ-COMMITTED事务隔离级别以上可以避免(示例如图2)
3.不可重复读:同一个事务中两次读取数据发生改变,这种改变是由另一个事务修改了对应记录引起的,REPEATABLE-READ事务隔离级别以上可以避免
4.幻读:在同一事务中,同一查询多次进行时候,由于其他事务插入操作(insert)的事务提交,导致每次返回不同的结果集(查到的数据增多或者减少),SERIALIZABLE事务隔离级别可以避免
(图1 更新丢失)
(图2 )
其他附加问题:
1、不可重复读和幻读的区别?
不可重复读的重点是修改。同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
幻读的重点在于新增或者删除。同样的条件, 第1次和第2次读出来的记录数不一样
2、事务隔离级别越高越好吗?
为了实现数据库事务,会消耗系统资源,同时也会在较低事务隔离级别的基础上添加一些如多版本并发控制、间隙锁这样的判断或锁,也会消耗时间,因而事务级别过高会降低查询效率