这个死锁原因是什么?

panyi5202 2017-12-12 11:06:24
LATEST DETECTED DEADLOCK
------------------------
2017-11-27 11:26:22 2b80ab881700
*** (1) TRANSACTION:
TRANSACTION 84983140, ACTIVE 3.138 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 13 lock struct(s), heap size 2936, 9 row lock(s), undo log entries 102
LOCK BLOCKING MySQL thread id: 4188408 block 4188409
MySQL thread id 4188409, OS thread handle 0x2b80c834c700, query id 1119236930 119.23.142.11

all5 update
INSERT INTO t_flow_real_time( `spot`,`group_quantity`,`booking`,`statistics_time` )
values ( 1,1,'2017-11-24','2017-11-27 11:26:21.007' )
ON DUPLICATE KEY UPDATE
`group_quantity` = group_quantity + 1
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1258 page no 4 n bits 104 index `idx_unique` of table `a_analysis`.`t_flow_real_time` trx id 84983140 lock_mode X waiting
Record lock, heap no 33 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 4; hex 80000001; asc ;;
1: len 3; hex 8fc378; asc x;;
2: len 4; hex 8000984d; asc M;;

*** (2) TRANSACTION:
TRANSACTION 84983143, ACTIVE 1.554 sec inserting
mysql tables in use 1, locked 1
13 lock struct(s), heap size 2936, 9 row lock(s), undo log entries 46
MySQL thread id 4188408, OS thread handle 0x2b80ab881700, query id 1119237503 119.23.142.11

all580 update
INSERT INTO t_flow_real_time ( `spot`, `group_quantity`, `booking`, `statistics_time` )
values ( 1, 1, '2017-11-26', '2017-11-27 11:26:22.407' )
ON DUPLICATE KEY UPDATE
`group_quantity` = group_quantity + 1
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1258 page no 4 n bits 104 index `idx_unique` of table `a_analysis`.`t_flow_real_time` trx id 84983143 lock_mode X
Record lock, heap no 33 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 4; hex 80000001; asc ;;
1: len 3; hex 8fc378; asc x;;
2: len 4; hex 8000984d; asc M;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1258 page no 4 n bits 104 index `idx_unique` of table `a_analysis`.`t_flow_real_time` trx id 84983143 lock_mode X waiting
Record lock, heap no 34 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
0: len 4; hex 80000001; asc ;;
1: len 3; hex 8fc37a; asc z;;
2: len 4; hex 8000987b; asc {;;

*** WE ROLL BACK TRANSACTION (2)
...全文
489 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复



日志是否有缺失呀?通过提供的日志分析出如下:
事务2(tx_id:84983143)应该有两条SQL,用sql1和sql2表示。
sql1对应的idx_unique数据库结构为:
hex 80000001
hex 8fc378
hex 8000984d
sql2对应的idx_unique数据库结构为:
hex 80000001
hex 8fc37a
hex 8000987b

事务1(tx_id:84983140)从日志只看到一条SQL,用sql1表示。
sql1对应的idx_unique数据库结构为:
hex 80000001
hex 8fc378
hex 8000984d

结果:
从日志分析能看出:
1、事务1 的sql1正在等待 事务2的sql1对应的二级索引(idx_unique(hex 80000001,hex 8000984d))记录上的X锁。
2、事务2的sql2正在等待 另一个事务的sql=sql2对应的二级索引 (idx_unique(hex 80000001,hex 8000987b))记录上的X锁。
因此出现事务1 等待 事务2, 而事务2 又等待 另一个事务的困境。若这里的 另一个事务 就是事务1的话,那就彻底死锁了; 若另一个事务 是 事务3的话,那就只有等事务3释放了事务2等待的X锁,事务2执行后再释放了事务1等待的X锁,这时候事务1才可以正常执行。
通过附件附上分析过程,供参考指正。
祥子爱游戏 2017-12-25
  • 打赏
  • 举报
回复
show processlist; 查看死锁发送时的sql
panyi5202 2017-12-13
  • 打赏
  • 举报
回复
补充表结构: Create Table CREATE TABLE `t_flow_real_time` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `spot` int(11) DEFAULT NULL COMMENT '景区', `group_quantity` int(11) DEFAULT '0' COMMENT '今日团队人数', `quantity` int(11) DEFAULT '0' COMMENT '今日票数', `consume_quantity` int(11) DEFAULT '0' COMMENT '核销数量', `consume_group_quantity` int(11) DEFAULT '0' COMMENT '核销团队人数', `refund_quantity` int(11) DEFAULT '0' COMMENT '退票数', `refund_group_quantity` int(11) DEFAULT '0' COMMENT '退票团队人数', `booking` date DEFAULT NULL COMMENT '游玩日期', `statistics_time` datetime DEFAULT NULL COMMENT '统计时间', PRIMARY KEY (`id`), UNIQUE KEY `idx_unique` (`spot`,`booking`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=46451 DEFAULT CHARSET=utf8 COMMENT='客流实时数据'
李民11 2017-12-12
  • 打赏
  • 举报
回复
你应该把表结构先发一下。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧