MySQL事务隔离级别总结

65 阅读2分钟

事务隔离级别

下图为一般情况下的隔离级别及可能出现的现象,mysql默认事务隔离级别为REPEATABLE READ

但,解决了幻读现象(gap lock)

image-20240120221506241.png

读时

  1. 在普通select情况下不加锁,而是采用快照(以当前时间点创建)的方式,保证当前事务下以后每次读到的数据都是该时间点之前提交的(可重复读)。除非当前事务自己修改了数据才会看到,因此可能出现幻写现象(修改到了看不到的数据),但是再次查询时会看到已修改的数据,并且在事务提交之前其它事务不能再次修改(修改时会加排它锁)。

  2. 可以手动为select加锁:for update(排它锁),lock in share mode(共享锁),这时使用的是next key lock,这种锁是record lockgap lock的结合体,在事务结束时释放锁。

    2.1 在使用for update的情况下,其它事务无法同时读取也无法修改或删除。

    record lock:如果查询条件为特定记录,则排它锁定返回的记录无索引时锁定整个表),导致其它事务无法读取也无法修改删除这些记录。

    gap lock:如果查询条件为范围查询,则排它锁定该范围,导致其它事务无法读取也无法修改删除这些记录,也无法在该范围内插入数据(无索引时锁定整个表),因此不会出现幻读现象。

    2.2 在使用lock in share mode情况下,其它事务只能读取,因此也是可重复读的。

    record lock:如果查询条件为特定记录,则共享锁定返回的记录无索引时锁定整个表),导致其它事务只能读取却无法修改删除这些记录。

    gap lock:如果查询条件为范围查询,则共享锁定该范围,导致其它事务只能读取却无法修改删除这些记录,也无法在该范围内插入数据(无索引时锁定整个表),因此不会出现幻读现象。

写时

update delete insert时,和for update是一样的效果,使用的也是排它锁记录或范围