脏度,不可重复读,幻读
脏度,不可重复读,幻读
脏读
事务1读取了被另一个事务2已修改,但还未提交
的数据。
不可重复读
事务2已经提交成功,此时事务1读取了一个其他的值。
解决不可重,有两个策略可以防止这个问题的发生
-
推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。
-
在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。
幻读
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。发生的情况:没有范围锁
数据库事务隔离级别
事务隔离级别区别:
当隔离级别设置为Read uncommitted(读未提交)时:
- 可能出现脏读
当隔离级别设置为Read committed(读已提交)时:
- 避免脏读
- 可能造成不能重复读
当隔离级别设置为Repeatable read(可重复读)时:
- 避免脏读,不可重复读
- 可能出现幻读
当隔离级别设置为Serializable(序列化)时:
- 避免脏读,不可重复读,幻读
由低到高依次为,可逐个解决脏读
、不可重复读
、幻读
- Read uncommitted(读未提交)
- Read committed(读提交)
- Repeatable read(可重复读)
- Serializable(序列化)
注意:Mysql的默认事务隔离级别:Repeatable read(可重复读)
数据库的两种读
数据库的两种读,每种读读的数据版本不一样,所以也称为MVCC
,即多版本并发控制
- 快照读 (形式:select * from where xxx)
- 当前读 (形式:update , insert ,delete ,select xx from xx for update , in share mode )
注意:当前读
会等待,不会返回数据的历史版本