我看到 MySQL 5.6 出现死锁,因为似乎试图锁定同一行两次。
从下面的代码片段中,id = (11, 12, 13, 14, 15) 的行已经有一个锁。当另一个事务试图获取这些锁时,MySQL 使事务检测到死锁失败。
我对此的解读是否正确?如果是这样,MySQL 5.6 中有什么可以解决这个问题吗?FWIW,5.5 中的相同代码工作得很好(数百次迭代)。
---------------------- 最新检测到的死锁 ---------------------- 2013-07-25 11:46:05 13a515000 *** (1) 交易: TRANSACTION 2333130,ACTIVE 0 秒获取行 mysql 表正在使用 1,锁定 1 LOCK WAIT 31 个锁结构,堆大小 6960,6 行锁 MySQL 线程 id 2944,OS 线程句柄 0x13ae88000,查询 id 184533 localhost 127.0.0.1 root 发送数据 SELECT id FROM table_meta WHERE id IN (11, 12, 13, 14, 15) FOR UPDATE *** (1) 等待授予此锁定: RECORD LOCKS 空间 id 128954 页号 5 n 位 176 表 `db_test1`.`table_meta` 的索引 `PRIMARY` trx id 2333130 lock_mode X 锁定记录但不锁定间隙等待 *** (2) 交易: TRANSACTION 2333255,ACTIVE 0 秒开始索引读取 mysql 表正在使用 1,锁定 1 3 个锁结构,堆大小 1248,11 行锁 MySQL 线程 id 2927,OS 线程句柄 0x13a515000,查询 id 186769 localhost 127.0.0.1 root 发送数据 SELECT id FROM table_meta WHERE id IN (1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15) 进行更新 *** (2) 持有锁: 记录锁空间 id 128954 页号 5 n 位 176 表 `db_test1`.`table_meta` 的索引 `PRIMARY` trx id 2333255 lock_mode X 锁定记录但不锁定间隙 *** (2) 等待授予此锁定: RECORD LOCKS 空间 id 128954 页号 5 n 位 176 表 `db_test1`.`table_meta` 的索引 `PRIMARY` trx id 2333255 lock_mode X 锁定记录但不锁定间隙等待 *** 我们回滚交易 (2)