首页

文章

请教一个 mysql 的死锁问题

发布网友 发布时间:2022-03-25 05:01

我来回答

2个回答

热心网友 时间:2022-03-25 06:31

我之前对死锁的理解一般情况就是A事务锁定了行a,B事务锁定了行b,然后这时A事务请求行b的锁,B事务请求行a的锁,就会HANG住不动,这就产生了死锁。
最近刚刚接触MYSQL,今天在看文档的过程中看到文档中举得一个死锁的例子,如下

SQL code?

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455

下列的例子演示当锁定请求可能会导致死锁之时一个错误会如何发生。例子中包括两个客户端A和B。<br data-filtered="filtered"><br data-filtered="filtered">首先客户端A创建一个包含一个行的表,然后开始一个事务。在这个事务内,A通过在共享模式选择行获得对行的S 锁定:<br data-filtered="filtered"><br data-filtered="filtered">mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;<br data-filtered="filtered"><br data-filtered="filtered">Query OK, 0 rows affected (1.07 sec)<br data-filtered="filtered"><br data-filtered="filtered"> <br data-filtered="filtered"><br data-filtered="filtered">mysql> INSERT INTO t (i) VALUES(1);<br data-filtered="filtered"><br data-filtered="filtered">Query OK, 1 row affected (0.09 sec)<br data-filtered="filtered"><br data-filtered="filtered"> <br data-filtered="filtered"><br data-filtered="filtered">mysql> START TRANSACTION;<br data-filtered="filtered"><br data-filtered="filtered">Query OK, 0 rows affected (0.00 sec)<br data-filtered="filtered"><br data-filtered="filtered"> <br data-filtered="filtered"><br data-filtered="filtered">mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;<br data-filtered="filtered"><br data-filtered="filtered">+------+<br data-filtered="filtered"><br data-filtered="filtered">| i    |<br data-filtered="filtered"><br data-filtered="filtered">+------+<br data-filtered="filtered"><br data-filtered="filtered">|    1 |<br data-filtered="filtered"><br data-filtered="filtered">+------+<br data-filtered="filtered"><br data-filtered="filtered">1 row in set (0.10 sec)<br data-filtered="filtered"><br data-filtered="filtered">接着,客户端B开始一个事务并尝试从该表删除行:<br data-filtered="filtered"><br data-filtered="filtered">mysql> START TRANSACTION;<br data-filtered="filtered"><br data-filtered="filtered">Query OK, 0 rows affected (0.00 sec)<br data-filtered="filtered"><br data-filtered="filtered"> <br data-filtered="filtered"><br data-filtered="filtered">mysql> DELETE FROM t WHERE i = 1;<br data-filtered="filtered"><br data-filtered="filtered">删除操作要求一个X 锁定。因为这个锁定不兼容客户端A持有的S锁定,所以X 锁定不被允许,所以请求进入对行及客户端阻挡的锁定请求队列。<br data-filtered="filtered"><br data-filtered="filtered">最后,客户端A也试图从表中删除该行:<br data-filtered="filtered"><br data-filtered="filtered">mysql> DELETE FROM t WHERE i = 1;<br data-filtered="filtered"><br data-filtered="filtered">ERROR 1213 (40001): Deadlock found when trying to get lock;<br data-filtered="filtered"><br data-filtered="filtered">try restarting transaction



客户端A首先对i=1那一行获取了S锁,然后客户端B在delete的时候尝试获取X锁就会进入等待,直到这一步我还是能理解的。可是后来在客户端A尝试删除i=1的数据行的时候,却报发生了死锁的错误,这是为什么呢?

lock in share mode称为共享锁

for update称为排他锁
当事务中包含select ...lock in share mode的时候,相关记录将会被锁住,不允许进行修改。

这个语句*在事务表的其他连接上进行UPDATE或者DELETE操作。
这个UPDATE会一直等待A连接执行commit或者rollback才会生效。

事务A获得了这个共享锁,自己也不能修改吗?
我觉得获得了这个锁是可以防止事务B的修改,可我不明白为什么事务A自己修改的时候会报错发现死锁

因为客户端A需要一个X 锁定来删除该行,所以在这里发生死锁。尽管如此,锁定请求不被允许,因为客户端B已经有一个对X锁定的请求并且它正等待客户端A释放S锁定。因为客户端B之前对X 锁定的请求,被客户端A持有的S锁定也不能升级到X锁定。因此,InnoDB对客户端A产生一个错误,并且释放它的锁定。在那一点上,客户端B的锁定请求可以被许可,并且客户端B从表中删除行。 “

这是文档里关于上面这段代码解释的一段话
如果非要理解,我只能这么理解:
1、就是说事务B优先进入了等待X锁的队列,而事务A排在它后面,因此只要B获取不了X锁,A肯定获取不到
2、A锁持有S锁,因此B也不可能获得X锁

这样就发生死锁了

B 等待A释放共享锁

2. A 的delete等待B释放排他锁

可是B并没有获得排他锁啊,因为B也在等待A的共享锁释放以后他才能获得排他锁

所以我更倾向于我前面说的那种解释,A和B都在等待排他锁,只不过B排在A前面

个人观点,欢迎讨论

A连接没有执行commit或者rollback,一直是锁定状态

恩 是的 不过此时A获取的也只是S锁定吧

我的理解如我#3所描述的那样,请帮忙看下那样理解正确吗?

看下英文的文档感觉更明朗些了
Deadlock occurs here because client A needs an X lock to delete the row. However, that lock request cannot be granted because client B already has a request for an X lock and is waiting for client A to release its S lock. Nor can the S lock held by A be upgraded to an X lock because of the prior request by B for an X lock. As a result, InnoDB generates an error for client A and releases its locks. At that point, the lock request for client B can be granted and B deletes the row from the table.

热心网友 时间:2022-03-25 07:49

说说看,什么情况下出现的死锁
2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 商业代理商业代理的特征 如何看微信有没有开通微众银行 为什么微众没有开户 微众银行怎么开户 微众银行APP开户流程是什么? 唐古拉山海拔唐古拉山海拔是多少 怎么看待取消跳广场舞的人的退休金 如何选购新鲜的蓝田水柿? 恭城水柿柿树作用 创维洗衣机使用教程 创维全自动洗衣机怎么使用 自动开门器 狗羊属相婚姻相配吗 3岁的小孩不会说话怎么办 3岁孩子不会说话,应该挂什么科? 3岁小孩不会说话正常吗 鹿茸炖乌鸡怎么做? 新型冠状肺炎吃什么药可以预防 冰箱上电后一直响 食品生产许可证编号开头为“ G”。 库存过期香精 猎狐点卡平台经营范围 电影代理靠谱吗 兄弟三人,有什么好的QQ网名 租赁合同书范本简单版 怎么解决mysql 事务出现死锁的问题 mysql 死锁:如何解决mysql死锁 请教一个MYSQL中死锁的问题 mysql死锁的原因和处理方法 mysql insert into select 语句为什么会造成死锁 mysql 存储过程出现死锁 2020-07-08:mysql只有一个表a,什么情况下会造成死锁,解决办法是什么? 软件闪退!怎么解决? vivo应用商店突然下载软件但无法安装,在浏览器中可下载可安装,但打开软件时闪退,怎么办,跪求!急 vivo浏览器后台运行的时候总是自动关闭? vivo浏览器总是停止运行 用vivo手机在uc浏览器看在线视频点击播放的时候出现闪退问题,怎么解决? vivo手机浏览器停止运行怎么恢复正常 vivoy31安装不了软件,在浏览器里下完后安装闪退? vivo浏览器停止运行 vivox60pro自带浏览器看一会视频会出现闪退这是啥毛病? vivo浏览器停止运行怎么办? vivoy37打开浏览器闪退 华为手机用vivo浏览器闪退 vivo浏览器中怎么闪退 MYSQL 存储过程报错Deadlock found when trying to get lock; try restarting transaction mysql发生死锁怎么解决 mysql 列级锁 死锁怎么办 如何避免mysql死锁问题 流量卡到底是什么东西? 手机流量卡是什么卡?怎么用? 手机流量卡是什么,怎么用?搞糊涂了 请问移动流量卡是什么?和普通手机卡有什么区别? 什么是电信“流量卡”? 移动流量卡什么意思 联通流量卡是什么? 移动流量卡和手机卡有啥区别 流量卡到底是什么东西? 联通流量卡是什么 无限量的流量卡是什么意思? 中国移动流量卡什么意思 什么是纯流量上网卡?纯流量卡多少钱一张呢? 腾讯流量卡是什么? 移动流量卡是什么意思?可以插在电视上看电视吗? 移动的4g流量卡套餐是什么意思
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com