不同隔离级别存在的问题
脏读:读取到其它事物未提交的数据
不可重复读:同事物中,同查询条件,前后读取结果不一致
幻读:同事物中,同查询条件,前后读取条数不一致
不同问题的解决方案
脏读
- 不对读操作加锁,通过MVCC解决,只读取符合事物快照版本的数据
不可重复读
- 事物的第一个查询就进行事物快照,后续查询都参考同一个快照版本
幻读
-
可重复读下并没有完全解决幻读,以下情况会产生幻读
情况1:不走快照读,走当前读
// 事物A查询id>5的数据,1条记录 select * from t1 where t1.id > 5; // 事物B插入id为7的数据,并提交事物 insert into t1 id values (7) ; // 事物A当前读,2条数据 select * from t1 where t1.id > 5 for update; 解决方案:事物A第一次查询时就加for update,会对>5的数据增加临键锁,事物B插入时会阻塞 select * from t1 where t1.id > 5 for update;
情况2: MVCC,别的事物新插入的数据记录tx_id,被当前事物更新了事物id
// 事物A查询id=5的数据,0条记录 select * from t1 where t1.id = 5; // 事物B插入id为5的数据,并提交事物 insert into t1 id values (5) ; // 事物A更新id=5的数据 update t1 set XXX where t1.id =5; // 事物A查询id=5的数据,1条记录 select * from t1 where t1.id =5;
- 串行:事物依次进行,解决了幻读