请教一个MYSQL中死锁的问题
时间:2011-08-26
来源:互联网
我之前对死锁的理解一般情况就是A事务锁定了行a,B事务锁定了行b,然后这时A事务请求行b的锁,B事务请求行a的锁,就会HANG住不动,这就产生了死锁。
最近刚刚接触MYSQL,今天在看文档的过程中看到文档中举得一个死锁的例子,如下
SQL code
客户端A首先对i=1那一行获取了S锁,然后客户端B在delete的时候尝试获取X锁就会进入等待,直到这一步我还是能理解的。可是后来在客户端A尝试删除i=1的数据行的时候,却报发生了死锁的错误,这是为什么呢?
最近刚刚接触MYSQL,今天在看文档的过程中看到文档中举得一个死锁的例子,如下
SQL code
下列的例子演示当锁定请求可能会导致死锁之时一个错误会如何发生。例子中包括两个客户端A和B。 首先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S 锁定: mysql> CREATE TABLE t (i INT) ENGINE = InnoDB; Query OK, 0 rows affected (1.07 sec) mysql> INSERT INTO t (i) VALUES(1); Query OK, 1 row affected (0.09 sec) mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE; +------+ | i | +------+ | 1 | +------+ 1 row in set (0.10 sec) 接着,客户端B开始一个事务并尝试从该表删除行: mysql> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) mysql> DELETE FROM t WHERE i = 1; 删除操作要求一个X 锁定。因为这个锁定不兼容客户端A持有的S锁定,所以X 锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列。 最后,客户端A也试图从表中删除该行: mysql> DELETE FROM t WHERE i = 1; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
客户端A首先对i=1那一行获取了S锁,然后客户端B在delete的时候尝试获取X锁就会进入等待,直到这一步我还是能理解的。可是后来在客户端A尝试删除i=1的数据行的时候,却报发生了死锁的错误,这是为什么呢?
作者: wh62592855 发布时间: 2011-08-26
lock in share mode称为共享锁
for update称为排他锁
当事务中包含select ...lock in share mode的时候,相关记录将会被锁住,不允许进行修改。
这个语句限制在事务表的其他连接上进行UPDATE或者DELETE操作。
这个UPDATE会一直等待A连接执行commit或者rollback才会生效。
for update称为排他锁
当事务中包含select ...lock in share mode的时候,相关记录将会被锁住,不允许进行修改。
这个语句限制在事务表的其他连接上进行UPDATE或者DELETE操作。
这个UPDATE会一直等待A连接执行commit或者rollback才会生效。
作者: WWWWA 发布时间: 2011-08-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28