mysql innoDB 死锁

一、什么是死锁
官方定义如下:两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会释放自己的锁。
这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人。你让对面放人,对面让你放人。

 

如下,A、B两个事务 出现了死锁,执行顺序如下:
1、A 执行 update report t set t.ui_config='test' where t.`name`= 'demo';
2、B执行  update report t set t.ui_config='test' where t.`name`= 'ldmiaoDemoxiugai';
3、B执行  update report t set t.ui_config='test' where t.`name`= 'demo';
4、A执行  update report t set t.ui_config='test' where t.`name`= 'ldmiaoDemoxiugai'; 出现了死锁

 

MySQL 如何处理死锁?
MySQL有两种死锁处理方式:
等待,直到超时(innodb_lock_wait_timeout=50s)。
发起死锁检测,主动回滚一条事务,让其他事务继续执行(innodb_deadlock_detect=on)。

从结果上分析,当mysql检测到死锁的时候,会让一条事务回滚,如测试结果出现 Deadlock found when trying to get lock; try restarting transaction 则该事务就回滚。 另一个事务则无需在等待锁。

 java程序如何避免死锁?
1、应该使用短事务,不用长事务,即要把一些数据校验和数据封装放到事务之外。
2、修改多个表或者多个行的时候,将修改的顺序保持一致。
例如: A程序修改 a表再修改b表,那么B程序也应该是先修改 a表再修改b表, 否则容易造成互相等待锁,造成死锁的情况。

禁止使用外键
外键在高并发情况下,会大大降低并发性,外键自身的维护性管理性也欠佳。原因如下:
a 数据库需要维护外键的内部管理;
b 外键等于把数据的一致性事务实现,全部交给数据库服务器完成;有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
c 外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值