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
    评论
MySQL外键约束在数据完整性和数据一致性方面有很多优点,但也存在一些缺点。以下是一些常见的缺点: 1. 性能影响:外键约束可能对数据库的性能产生一定的影响。当进行插入、更新或删除操作时,数据库需要确保外键关系的完整性,这可能增加查询的时间和资源消耗。 2. 跨表操作复杂:在涉及到多个表的查询操作中,外键约束可能增加了操作的复杂性。需要正确处理关联表之间的顺序,以避免出现死锁或循环依赖的情况。 3. 数据库设计限制:外键约束要求在设计数据库时提前定义好表之间的关系,这可能限制一些灵活性。如果需要频繁地调整表结构或关系,可能需要删除或修改外键约束,这可能导致一些操作变得复杂或不可行。 4. 数据库迁移困难:在进行数据库迁移或合并时,外键约束可能带来一些问题。如果外键关系在源数据库和目标数据库之间不匹配,可能需要进行额外的处理才能成功迁移数据。 5. 错误处理复杂:当遇到外键约束错误时,需要仔细处理错误信息以确保数据的完整性。错误处理可能涉及到回滚操作、记录日志或其他额外的处理步骤。 尽管存在这些缺点,外键约束仍然是保持数据完整性和一致性的重要工具,特别是在涉及复杂关系和跨表操作的数据库设计中。综合考虑,开发人员需要根据具体情况权衡使用外键约束的利弊。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值