我的应用程序遇到了mysql死锁问题,这使我很困惑。希望有人可以帮助我分析原因。
死锁后,我使用SHOW ENGINE INNODB STATUS
命令查找原因,但发现它们是两个不同的表,事务1只是具有表'bond_company'的'select'查询,事务2是具有以下内容的更新表“贷款”。为什么两个不相关的表会产生死锁问题,而其中一个sql只是带有S锁的“选择”查询?
下面是结果中信息显示的一部分,有些敏感的信息可能被隐藏了,希望对您有所帮助。
***(1)交易: 交易10CE99C9,正在活动的13.489秒起始索引读取 mysql表正在使用中1,锁定1 LOCK WAIT 250个锁结构,堆大小31160,7549行锁 LOCK BLOCKING MySQL线程ID:3224405块3224407 MySQL线程ID 3224407,操作系统线程句柄0x2b3002a83700,查询ID 1395754180 ip db_account统计信息
select bond_id, bond_code, bond_name from bond_company where bond_id = 1
***(1)等待授予此锁:
记录锁定空间ID 24016页面编号3 n位表PRIMARY
的80索引db_account
。bond_company
trx id 10CE99C9锁定模式S锁定记录但不等待间隙
***(2)交易: 交易10CE99F9,正在活动7.532秒的起始索引读取 mysql表正在使用中1,锁定1 175个锁定结构,堆大小31160、792个行锁定,撤消日志条目1 MySQL线程ID 3224405,操作系统线程句柄0x2b3002a42700,查询ID 1395754532 ip db_account更新
update loan SET if_sussessful = 'Y' where loan_id = 7177
***(2)持有锁:
RECORD LOCKS空间ID 24016页面编号3 n位80表PRIMARY
的索引db_account
。bond_company
trx id 10CE99F9 lock_mode X锁定rec但不锁定空白
***(2)等待授予此锁:
RECORD LOCKS空间ID 24154页面编号325 n位104表PRIMARY
的索引db_account
。loan
trx id 10CE99F9 lock_mode X锁定rec但不等待间隔
***我们回滚交易(2)