MySQL 的事务隔离级别和锁

MySQL 的事务隔离级别(Isolation Level)

 

 数据库锁,分为悲观锁和乐观锁,“悲观锁”

  • 悲观锁一般利用 SELECT … FOR UPDATE 类似的语句
  • 乐观锁利用 CAS 机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,实现版本判断。

脏读: 读到了未提交事务的数据。

不可重复读: 事务 A 先读取一条数据,然后执行逻辑的过程中,事务 B 更新了这条数据,事务 A 再读取时,发现数据不匹配,这个现象就是“不可重复读”。

 

幻读: 在一个事务内,同一条查询语句在不同时间段执行,得到不同的结果集。

  1. 解决幻读的办法是锁住记录之间的“间隙”,为此 MySQL InnoDB 引入了新的锁,叫间隙锁(Gap Lock),所以在面试中,你也要掌握间隙锁,以及间隙锁与行锁结合的 next-key lock 锁。

一般都用设置RC ,不用RR,间隙锁性能低,可能锁表

 

死锁只有同时满足互斥、持有并等待、不可剥夺、循环等待时才会发生

 

  • 持有并等待:我们可以一次性申请所有的资源,这样就不存在等待了。

  • 不可剥夺:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源,这样不可剥夺这个条件就破坏掉了。

  • 循环等待:可以靠按序申请资源来预防,也就是所谓的资源有序分配原则,让资源的申请和使用有线性顺序,申请的时候可以先申请资源序号小的,再申请资源序号大的,这样的线性化操作就自然就不存在循环了。

 

posted @ 2023-03-14 14:43  jiaozg  阅读(64)  评论(0)    收藏  举报