死锁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值