MySQL数据库外键导致死锁

38 篇文章 0 订阅
38 篇文章 0 订阅

1,常规死锁的原因是相互持有对方的锁,不能释放导致的

问题是,针对同一张表的两条数据

事务1先开启执行step-1, 对id=1这条数据加排他锁(X锁),

事务2开启 执行step-2,对id=2这条纪录加排他锁(X锁)

事务1执行step-3,此时事务2已经持有id=2的排他锁,所以step-3处于等待状态

事务2 执行step-4,发现事务1已经持有id=1的锁,导致互相等待

报死锁

2,特例死锁:两张表修改同一条数据并且存在外键关联,出现死锁

 

B表为主表,A表持有B表主键,存在外键关联的情况,如果数据发生变化:增删改情况,mysql都会默认的先去主表查询数据并且增加共享锁,防止当前修改的数据发生

出现死锁的过程:

事务1执行step-1,条件为b_id=1,因为存在外键关联,在修改这条数据的时候,mysql会去主表B查询外键数据,并且默认给B表的id=1的这条数据加共享锁。

事务2执行step-2,同样会发生上面的step-1的情况持有B表的共享锁

事务1执行step-3,执行id=1的数据,发现这条数据有事务2的共享锁,然后进入等待状态

事务2执行step-4,执行id=1的数据,发现这条数据有事务1的共享锁,然后进入相互等待

出现死锁

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值