- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
寻求帮助以了解为什么会出现这种僵局。我已经阅读了 MySQL 文档和许多关于死锁相关问题的 SO 问题,但我显然遗漏了一些东西。
这是有问题的表:
CREATE TABLE `table_queue` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB ;
它有一大堆其他列已被删除以保持简单(没有一个是外键)。
两个或多个线程正在执行以下查询:
DELETE q FROM table_queue q WHERE q.id IN(165765,165770,165782,165787,165791 .. );
IN 语句最多可以有 1,000 个值。如您所见,它正在删除首要的关键。但是innodb status输出显示有一个线程在等待锁在甚至不在其删除列表中的记录上(在 IN 子句中)。
显示引擎 INNODB 输出:
------------------------
LATEST DETECTED DEADLOCK
------------------------
140526 15:54:03
*** (1) TRANSACTION:
TRANSACTION A841, ACTIVE 1 sec fetching rows
mysql tables in use 1, locked 1
LOCK WAIT 36 lock struct(s), heap size 2496, 882 row lock(s), undo log entries 70
MySQL thread id 59, OS thread handle 0xa69d9b40, query id 40446 localhost 127.0.0.1 localhost Sending data
DELETE q FROM table_queue q WHERE q.id IN(165765,165770,165782,165787, ...
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 4653 n bits 216 index `PRIMARY` of table `maildb`.`table_queue` trx id A841 lock_mode X waiting
Record lock, heap no 67 PHYSICAL RECORD: n_fields 20; compact format; info bits 0
0: len 4; hex 800288fb; asc ;;
1: len 6; hex 00000000a82d; asc -;;
2: len 7; hex a2000001e83a9e; asc : ;;
3: len 4; hex 80000001; asc ;;
4: len 4; hex 80000002; asc ;;
5: len 11; hex 6361726c6f732b36313535; asc jsmith+6155;;
6: len 5; hex 536d697468; asc Smith;;
7: len 22; hex 6361726c6f732b3631353540636f6d6d65722e636f6d; asc jsmith+6155@domain.com;;
8: len 4; hex 8000180b; asc ;;
9: len 8; hex 43617465676f7279; asc Category;;
10: len 4; hex 80000000; asc ;;
11: len 4; hex 80000000; asc ;;
12: len 4; hex 80000000; asc ;;
13: len 4; hex 80000000; asc ;;
14: SQL NULL;
15: SQL NULL;
16: len 1; hex 91; asc ;;
17: SQL NULL;
18: SQL NULL;
19: SQL NULL;
*** (2) TRANSACTION:
TRANSACTION A844, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
30 lock struct(s), heap size 2496, 646 row lock(s)
MySQL thread id 60, OS thread handle 0xa69a8b40, query id 40453 localhost 127.0.0.1 localhost Sending data
DELETE q FROM table_queue q WHERE q.id IN(166139,166146,166162,166166,166171,166175,166177,....
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 4653 n bits 216 index `PRIMARY` of table `maildb`.`table_queue` trx id A844 lock mode S locks rec but not gap
Record lock, heap no 67 PHYSICAL RECORD: n_fields 20; compact format; info bits 0
0: len 4; hex 800288fb; asc ;;
1: len 6; hex 00000000a82d; asc -;;
2: len 7; hex a2000001e83a9e; asc : ;;
3: len 4; hex 80000001; asc ;;
4: len 4; hex 80000002; asc ;;
5: len 11; hex 6361726c6f732b36313535; asc jsmith+6155;;
6: len 5; hex 536d697468; asc Smith;;
7: len 22; hex 6361726c6f732b3631353540636f6d6d65722e636f6d; asc jsmith+6155@domain.com;;
8: len 4; hex 8000180b; asc ;;
9: len 8; hex 43617465676f7279; asc Category;;
10: len 4; hex 80000000; asc ;;
11: len 4; hex 80000000; asc ;;
12: len 4; hex 80000000; asc ;;
13: len 4; hex 80000000; asc ;;
14: SQL NULL;
15: SQL NULL;
16: len 1; hex 91; asc ;;
17: SQL NULL;
18: SQL NULL;
19: SQL NULL;
Record lock, heap no 74 PHYSICAL RECORD: n_fields 20; compact format; info bits 0
0: len 4; hex 80028902; asc ;;
1: len 6; hex 00000000a82d; asc -;;
2: len 7; hex a2000001e83af9; asc : ;;
3: len 4; hex 80000001; asc ;;
4: len 4; hex 80000001; asc ;;
5: len 11; hex 6361726c6f732b36313632; asc jsmith+6162;;
6: len 5; hex 536d697468; asc Smith;;
7: len 22; hex 6361726c6f732b3631363240636f6d6d65722e636f6d; asc jsmith+6162@domain.com;;
8: len 4; hex 80001812; asc ;;
9: len 8; hex 43617465676f7279; asc Category;;
10: len 4; hex 80000000; asc ;;
11: len 4; hex 80000000; asc ;;
12: len 4; hex 80000000; asc ;;
13: len 4; hex 80000000; asc ;;
14: SQL NULL;
15: SQL NULL;
16: len 1; hex 94; asc ;;
17: SQL NULL;
18: SQL NULL;
19: SQL NULL;
...
...
据我了解,事务A841是想获取某条记录的独占锁。在这种情况下我可以告诉记录有 id = 166139。查看应用程序日志,我可以看出事务/线程在其 DELETE IN 子句中没有 id 166139 那么为什么它需要对该记录进行锁定?
如果您使用主键明确指定要删除的行,MySQL 应该只锁定那些匹配的 PK 行,我是否误解了?是否有可能锁定其他相邻行出于某种原因?
最佳答案
Innodb 会锁定所有需要扫描的行,以防删除操作。您可以通过阅读以下博客更好地理解:
关于使用主键 IN 语句删除时的 Mysql Innodb 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23877231/
我在 php 方面遇到了一个小问题,我发现很难用语言来解释。我有一个包含键值的关联数组。我想制作一个函数(或者如果已经有一个函数),它将一个数组作为输入并删除重复项,但两种方式都是如此。 例如: 在我
我有一个在系统托盘中运行的应用程序,是否可以允许用户通过 C# 中的 Windows 键 + 键 恢复该应用程序? 谢谢 最佳答案 是的,使用 Windows API。我认为 Windows 键与 C
我正在使用 Waterline通过 Sails 查询 MySQL 数据库。我找到了 2 种方法。 不知道哪个更好? 顺便问一下,如何处理这两种情况的错误? 1. Model.findOne().whe
我正在尝试测试是否按下了 Alt 键。 我的支票类似于: private void ProcessCmdKey(Keys keyData) { if (keyData == Keys.Alt) {
我正在使用 Selenium WebDriver 和 Ruby 进行自动化测试。我需要点击一个按钮。我无法通过 id 或 css 或 xpath 获取按钮元素,因为按钮是透明的。我想使用 Tab 和
我是 IntelliJ 的新手,我看到一个启动提示说,“任何工具窗口中的 ⎋ 键都会将焦点移动到编辑器。”但是,我不知道⎋键是什么。我一直在编程很长时间。我的键盘上可能有一个我多年来一直错过的键吗?
我使用 OMDB API 创建了一个电影搜索页面。我遇到的问题是,如果我搜索一部包含多个单词的电影,此 API 会出错,因为 API 的 URL 必须在 URL 中的每个单词之间有 + 键。所以我想知
我已经用 Elasticsearch 玩了大约一天了,所以我非常陌生。我正在尝试 POST/import 一个简单的文件: { "compression" : "none", "com
enter image description here 在此示例中,要记录带有“title”和“director”键的属性值,使用 obj[key]。因为我们已经处于对象的执行上下文中:在本例中是电
我是新开类。 我使用新的电子邮件 ID 和密码在 openshift 上创建了一个项目。让我们称之为 firstApp 。我做了 rhc 设置和我的 ssh key 与我的项目相关联。 我的 frie
当我使用 Jackson 反序列化 json 字符串时,我通常不想创建所有 bean 类的属性,而且我只需要一些 json 字符串的字段,其他字段我不需要。所以我经常只在我需要的 java 类 bea
我想编写一个带有 keys/keys* 的规范,但能够内联值规范,但不支持 by design ,我明白了其背后的原因。然而,有时,本地图存在特定上下文时,您确实希望(或者只是通过遗留或第三方)键和值
my %fruit_colors = ("apple", "red", "banana", "yellow"); my @fruits = keys %fruit_colors; my @colors
我正在使用 vb.net 2008 和 DataGridView。我正在寻找允许我将 enter 键移动到右侧的下一列而不是在保持在同一列时向下移动一行的代码。 最佳答案 如果您正在确认编辑,只需移动
我刚刚开始学习编码,我遇到了这个我无法理解的问题。 “我们将添加的第二个函数称为搜索,它将以名字作为参数。它将尝试将收到的名字与我们 friend 联系人列表中的任何名字相匹配。如果它找到匹配项,就会
我已经在 Python 中运行了下面的代码,以从文本文件中生成单词列表及其计数。我该如何从“Frequency_list”变量中过滤掉计数为 1 的单词? 另外,如何将底部的打印语句循环导出到CSV
我正在尝试 XSLT 中的查找表示例,但无法使其正常工作
是否可以在 Javascript/Typescript 中编写一个将参数名称/键作为字符串返回的函数? function foo(arg) {...} let user = new User(); f
我正在尝试创建一个带有键/值的对象,但是当我看到该对象时,键没有正确填充.. 我希望键是 - 0,1,2,3 但它显示“索引”作为键。 > categories = ["09/07/2016 00:0
将 Android Studio 从 1.5 升级到 2.0 后,模拟器(现在版本为 25.1.1,我在其上配置了模拟硬件键盘)不再将 [Esc] 键识别为等同于 [Back] 按钮。 如何恢复这个有
我是一名优秀的程序员,十分优秀!