不同隔离级别下的加锁算法

读未提交下:

  • 增:插入数据后,给新插入的数据上记录锁,防止其它事务更改这条记录

  • 删:需要获取到要删除的记录的记录锁,保证删除的时候其它事务没在使用这些数据,并保证删除后其它事务无法对这些数据进行操作

  • 改:给需要更改的数据上记录锁

  • 查:普通select不上锁,直接读最新数据,不管是否提交,select…for update 或 select … lock in share mode会上记录锁,不锁间隙!

读已提交下:

  • 增:插入数据后,给新插入的数据上记录锁,防止其它事务更改这条记录

  • 删:需要获取到要删除的记录的记录锁,保证删除的时候其它事务没在使用这些数据,并保证删除后其它事务无法对这些数据进行操作

  • 改:给需要更改的数据上记录锁

  • 查:普通select不上锁,通过MVCC找到读取的数据,select…for update 或 select … lock in share mode会上记录锁,不锁间隙!

可重复读下:

  • 增:使用插入****意向锁,进行插入,插入后给插入的数据上记录锁(隐式锁,其实这个记录锁不是这个时候上的)

  • 删:使用临键锁,防止其它事务在删除的区间内插入数据

  • 改:给需要更改的数据上临键锁

  • 查:普通select不上锁,通过MVCC找到读取的数据,select…for update 或 select … lock in share mode会上临键锁,锁间隙!

串行化读下:

  • 增:使用插入****意向锁,进行插入,插入后给插入的数据上记录锁(隐式锁,其实这个记录锁不是这个时候上的)

  • 删:使用临键锁,防止其它事务在删除的区间内插入数据

  • 改:给需要更改的数据上临键锁

  • 查:普通查询自动变为select … lock in share mode,上临键锁,锁间隙

posted @ 2025-03-29 01:03  Zero&&One  阅读(39)  评论(0)    收藏  举报