sql死锁

sql死锁

模拟场景

# 客户端口1
begin;
select * from test where id = 1 for update;
# 第 3步
update test set name = "lf" where id =2;
# 客户端2
begin;
# 步骤2
delete from test where id = 2;
# 步骤4
delete from test where id = 1;

两个客户互相等待锁资源 造成死锁。并发业务下sql 会崩溃

两种结局策略

设置等待超时时间 innodb_lock_wait_timeout

innodb_lock_wait_timeout 默认值是50
这个超时时间不单是死锁的时候才会算,普通的事务在等待的时候也会算等待时间不能很好的定位死锁问题

发起死锁检测,发现死锁主动回滚死锁链中的某一个事务 inondb_deadlock_detect 设置no

当事务被锁时,会查看依赖的线程又没被锁住,最后判断是否出现循环等待。
**弊端:**对一个锁有 100个请求,检测死锁会耗费大量的cpu资源,执行事务效率大大降低。

其他思路

限制sql 的并发成都,让同一个锁同时,请求有上限例如30

修改mysql 源码(大佬)

逻辑多行:例如,商品单价,和商品总和。吧一个数据,拆分成多份,最后求和。减少行锁的几率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值