MySQL锁系列 之 死锁

本文探讨了MySQL中的死锁现象,包括死锁的定义、产生的条件和危害。详细分析了多种典型的死锁案例,并指出尽管有死锁检测机制能解决僵局,但频繁的死锁需要调整业务逻辑来预防。最后,文章提供了避免死锁的方法和总结。
摘要由CSDN通过智能技术生成

一、什么是死锁

  • 1.必须满足的条件
1. 必须有两个或者两个以上的事务
2. 不同事务之间都持有对方需要的锁资源。 A事务需要B的资源,B事务需要A的资源,这就是典型的AB-BA死锁
  • 2.死锁相关的参数
* innodb_print_all_deadlocks

1. 如果这个参数打开,那么死锁相关的信息都会打印输出到error log

* innodb_lock_wait_timeout

1. 当MySQL获取row lock的时候,如果wait了innodb_lock_wait_timeout=N的时间,会报以下错误

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

* innodb_deadlock_detect

1. innodb_deadlock_detect = off  可以关闭掉死锁检测,那么就发生死锁的时候,用锁超时来处理。
2. innodb_deadlock_detect = on  (默认选项)开启死锁检测,数据库自动回滚

* innodb_status_lock_output = on

1. 可以看到更加详细的锁信息

二、死锁有什么危害

  1. 死锁,即表明有多个事务之间需要互相争夺资源而互相等待。
  2. 如果没有死锁检测,那么就会互相卡死,一直hang死
  3. 如果有死锁检测机制,那么数据库会自动根据代价来评估出哪些事务可以被回滚掉,用来打破这个僵局
  4. 所以说:死锁并没有啥坏处,官网:www.fhadmin.org  反而可以保护数据库和应用
  5. 那么出现死锁,而且非常频繁,我们应该调整业务逻辑,让其避免产生死锁方为上策

三、典型的死锁案例剖析

3.1 死锁案例一

典型的 官网:www.fhadmin.org AB-BA 死锁

session 1:
    select * from tb_b where id_2 = 1 for update (A)

session 2:
    select * from tb_a where id = 2 for update (B)

session 1:
    select * from tb_a where id = 2 for update (B)

session 2:
    select * from tb_b where id_2 = 1 for update (A)
    ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

1213的死锁错误,mysql会自动回滚
哪个回滚代价最小,回滚哪个(根据undo判断)



------------------------
LATEST DETECTED DEADLOCK
------------------------
2017
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值