死锁原因及解决

一、死锁的原因

1.两个线程更新表顺序不一致

例如:线程1先对表1加锁,再请求表2的锁;
   线程2先对表2加锁,再请求表1的锁。
这时,线程1会等待线程2释放表2的锁,而线程2又在等待线程1释放表1的锁,相互等待就产生了死锁,如图:表顺序导致死锁

2.两个分片同时更新广播表

(1)广播表定义:分布式数据库中,有的表中的数据更新频率较低,但是查询频率较高,为了避免分布式事务,就要建立广播表。
(2)广播表特性:广播表在各个分片的数据是一样的。
  查询:每个分片只需要查询自己所在分片的数据即可;
  修改:一个分片修改数据后,要将修改内容同步至其他分片上。
(3)死锁原因:
  分片X修改了数据,对分片1、2加锁进行更新,在请求分片3、4的锁;
  分片Y也修改了数据,对分片3、4加锁进行更新,在请求分片1、2的锁。
这时,分片X在等待分片Y释放分片3、4的锁,分片Y在等待分片X释放1、2的锁,相互等待就产生了死锁,如图:广播表更新导致死锁

二、死锁产生的业务场景

1.不同批量节点之间

  不同批量节点之间,可能更新的表顺序不一样,就产生了第一种死锁场景。

2.相同批量的不同子节点间

  相同子节点间,表的更新顺序是一样的,理论上只会产生第二种死锁。

3.联机与批量

  当系统在跑批量时,有联机交易进来,就可能触发上面2种死锁。

三、死锁的解决

1.将联机、批量的表更新顺序调整一样

  如果程序种表的更新顺序是一样的,就不会出现第一种死锁。

2.更新频率高的表不要设置广播表

  更新频率高的表不适合设置成广播表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值