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 源码(大佬)
逻辑多行:
例如,商品单价,和商品总和。吧一个数据,拆分成多份,最后求和。减少行锁的几率