MYSQL死锁案例

2014-11-24 15:41:45 · 作者: · 浏览: 0
MYSQL死锁案例
01
下列的例子演示当锁定请求可能会导致死锁之时一个错误会如何发生。例子中包括两个客户端A和B。
02

03
首先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S 锁定:
04

05
mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
06

07
Query OK, 0 rows affected (1.07 sec)
08

09
  
10

11
mysql> INSERT INTO t (i) VALUES(1);
12

13
Query OK, 1 row affected (0.09 sec)
14

15
  
16

17
mysql> START TRANSACTION;
18

19
Query OK, 0 rows affected (0.00 sec)
20

21
  
22

23
mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
24

25
+------+
26

27
| i    |
28

29
+------+
30

31
|    1 |
32

33
+------+
34

35
1 row in set (0.10 sec)
36

37
接着,客户端B开始一个事务并尝试从该表删除行:
38

39
mysql>
START TRANSACTION; 40 41 Query OK, 0 rows affected (0.00 sec) 42 43 44 45 mysql> DELETE FROM t WHERE i = 1; 46 47 删除操作要求一个X 锁定。因为这个锁定不兼容客户端A持有的S锁定,所以X 锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列。 48 49 最后,客户端A也试图从表中删除该行: 50 51 mysql> DELETE FROM t WHERE i = 1; 52 53 ERROR 1213 (40001): Deadlock found when trying to get lock; 54 55 try restarting transaction