面试_mysql_数据库中的死锁

45 阅读1分钟

死锁是指多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。


1、场景:

  • 事务1:先更新id为1的数据;再更新id为2的数据
  • 事务2:先更新id为2的数据;再更新id为1的数据

这样的话,如果事务1更新了id为1的数据,就相当于给该条记录加锁,其他事务不能对其更新,

此时事务2恰好也更新了id为2的数据,也自动对其加了锁。这样两个事务都无法继续自己的第二条语句,相互卡死



2、解决方案

通常很多的死锁都是程序处理的自身逻辑有问题,可以做一些规范:

  • 不同的业务并发访问多个表时,应约定 以相同的顺序访问这些表
  • 在同一个事务中,尽可能做到 一次锁定所需要的所有资源,减少死锁产生概率;
  • 升级锁定颗粒度,通过 表级锁 定来减少死锁产生的概率。