死锁

来源:互联网 发布:c语言游戏编程 编辑:程序博客网 时间:2024/03/29 02:02

  是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

  表级锁不会产生死锁。所以解决死锁主要还是针对于最常用的InnoDB

先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S 锁定:
04 
05mysql> CREATETABLE t (i INT) ENGINE = InnoDB;
06 
07Query OK, 0 rowsaffected (1.07 sec)
08 
09
10 
11mysql> INSERTINTO t (i) VALUES(1);
12 
13Query OK, 1 row affected (0.09 sec)
14 
15
16 
17mysql> START TRANSACTION;
18 
19Query OK, 0 rowsaffected (0.00 sec)
20 
21
22 
23mysql> SELECT* FROM t WHERE i = 1 LOCKIN SHARE MODE;
24 
25+------+
26 
27| i |
28 
29+------+
30 
31| 1 |
32 
33+------+
34 
351 row inset (0.10 sec)
36 
37接着,客户端B开始一个事务并尝试从该表删除行:
38 
39mysql> START TRANSACTION;
40 
41Query OK, 0 rowsaffected (0.00 sec)
42 
43
44 
45mysql> DELETEFROM t WHEREi = 1;
46 
47删除操作要求一个X 锁定。因为这个锁定不兼容客户端A持有的S锁定,所以X 锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列。
48 
49最后,客户端A也试图从表中删除该行:
50 
51mysql> DELETEFROM t WHEREi = 1;
52 
53ERROR 1213 (40001): Deadlock found when trying toget lock;
54 
55try restarting transaction
0 0
原创粉丝点击