事物隔离级别-学习

135 阅读1分钟

image.png

不同隔离级别存在的问题

脏读:读取到其它事物未提交的数据

不可重复读:同事物中,同查询条件,前后读取结果不一致

幻读:同事物中,同查询条件,前后读取条数不一致

不同问题的解决方案

脏读
  • 不对读操作加锁,通过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
  • 串行:事物依次进行,解决了幻读