[关闭]
@JunQiu 2018-09-24T13:51:23.000000Z 字数 2187 阅读 1332

mysql死锁的产生及解决

summary_2018/09 mysql

1、日常

1.1、mysql死锁的产生及解决

2、技术

2.1、mysql死锁的产生及解决
2.1.1、什么是死锁??
2.1.2、MYSQL数据库中死锁??
  1. // 事务A
  2. mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
  3. Query OK, 0 rows affected (1.07 sec)
  4. mysql> INSERT INTO t (i) VALUES(1);
  5. Query OK, 1 row affected (0.09 sec)
  6. // 开启A
  7. mysql> START TRANSACTION;
  8. Query OK, 0 rows affected (0.00 sec)
  9. // 给i=1这行加上共享锁
  10. mysql> SELECT * FROM t WHERE i = 1 FOR SHARE;
  11. +------+
  12. | i |
  13. +------+
  14. | 1 |
  15. +------+
  16. ------ 事务B ------
  17. mysql> START TRANSACTION;
  18. Query OK, 0 rows affected (0.00 sec)
  19. // 给i=1这行加上排它锁,会被放入队列中进入lock wait
  20. mysql> DELETE FROM t WHERE i = 1;
  21. ------ 事务B ------
  22. // 此时事务A也需要给改行加上排它锁,形成死锁
  23. mysql> DELETE FROM t WHERE i = 1;
  24. ERROR 1213 (40001): Deadlock found when trying to get lock;
  25. try restarting transaction
  26. 解释:B需要给该行加排它锁,需要A的共享锁解锁,但是A共享锁解锁的条件是给该行加上排它锁,但是A加排它锁在B后面,要等B加上才能执行,所以陷入死锁。
2.1.3、死锁检测与回滚
2.1.4、解决和避免死锁
2.1.5、参考文档
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注