是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
表级锁不会产生死锁。所以解决死锁主要还是针对于最常用的InnoDB
先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S 锁定:
05 | mysql> CREATE
TABLE t (i INT ) ENGINE = InnoDB; |
07 | Query OK, 0 rows
affected (1.07 sec) |
11 | mysql> INSERT
INTO t (i) VALUES (1); |
13 | Query OK, 1 row affected (0.09 sec) |
17 | mysql> START TRANSACTION ; |
19 | Query OK, 0 rows
affected (0.00 sec) |
23 | mysql> SELECT
* FROM
t WHERE i = 1 LOCK
IN SHARE MODE; |
35 | 1 row in
set (0.10 sec) |
37 | 接着,客户端B开始一个事务并尝试从该表删除行: |
39 | mysql> START TRANSACTION ; |
41 | Query OK, 0 rows
affected (0.00 sec) |
45 | mysql> DELETE
FROM t WHERE
i = 1; |
47 | 删除操作要求一个X 锁定。因为这个锁定不兼容客户端A持有的S锁定,所以X 锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列。 |
51 | mysql> DELETE
FROM t WHERE
i = 1; |
53 | ERROR 1213 (40001): Deadlock found
when trying to
get lock; |
55 | try restarting transaction |