mysql死锁

rorom 2012-09-23 02:34:21
最近的项目,每一个事务的的动作太多,然后测试发现有功能导致mysql死锁了
不过很奇怪的是,死锁的语句是一条单纯的非事务update语句,这个我就有点想不通了,如果说是另一个事务锁住了当前行,那么这条update就一句话肯定是无法阻挡事务的继续执行,那么事务执行完毕之后,次update便可以顺利执行了,现在的现象是,用show processlist查看整个数据库就只有这条update处理update状态,没有任何其他语句阻塞,直到达到超时时间50秒,才释放.
这还请高手指点原因.
另外,如果事务锁表较多,是否应该尽量使用同一顺序?如果表有差异,却有局部相同的表,怎么处理比较好呢?
...全文
646 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lackiezizhan 2014-09-13
  • 打赏
  • 举报
回复
查看最后一次死锁的命令行: show engine innodb status;
rorom 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

mysql5.5之后 show engine innodb status\G
[/Quote]

show engine innodb status\G
[SQL] show engine innodb status\G

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\G' at line 1

show engine innodb status
[SQL] show engine innodb status

Affected rows: 0
Time: 1.110ms

type name status
InnoDB
rucypli 2012-09-24
  • 打赏
  • 举报
回复
mysql5.5之后 show engine innodb status\G
rorom 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

show innodb status可以看上一次死锁的原因
[/Quote]

show innodb status;

[SQL] show innodb status;
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'innodb status' at line 1
rucypli 2012-09-24
  • 打赏
  • 举报
回复
show innodb status可以看上一次死锁的原因
rorom 2012-09-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

show process 看一下是和哪个进程产生冲突。
[/Quote]
是show processlist? 这个在本地不好重现的,在服务器上才有,我几次在服务器上都是一个update,在那里卡着,没有其他语句,这个怎么看呢?
ACMAIN_CHM 2012-09-24
  • 打赏
  • 举报
回复
你的语句是什么? 表的create table 语句是什么? show index from xxx 也一同贴出以供分析。
rorom 2012-09-24
  • 打赏
  • 举报
回复
不好意思,带大家走进了误区,刚看了,其实不是死锁了,那句update是updating状态的,刚查到是:正在搜索匹配的记录,并且修改它们. 这个意思,但是这个过程很长,一直持续到这条语句失败.长达十多秒
rorom 2012-09-24
  • 打赏
  • 举报
回复
继续等回复~~~~~~~~~
ACMAIN_CHM 2012-09-23
  • 打赏
  • 举报
回复
show process 看一下是和哪个进程产生冲突。
rorom 2012-09-23
  • 打赏
  • 举报
回复
刚才又出现了,查询到一直在更新中的语句是:
update body_1 set status=2
where order_id=12346546
这条语句调用的地方,只有唯一一个不带事务的方法,order_id是另外一个表的主键,但是没有做实际的外键关联.

事务中的方法的执行顺序是
update order_1 set status_x=1,status_y=2
where order_id = 12346546
update body_1 set status=3
where order_id=12346546
update xxx set xxx1=1111
update yyy set xxx2=1111
update zzz set xxx3=1111
大概就是这样的结构,触发顺序是:事务先执行,然后锁表的那个update也顺利瞬间完成了执行,然后到了第二条订单,事务执行顺利完成,然后到锁表的update就锁住了,就是这样的
求高手分析!

rorom 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

锁是锁的索引块 并不是锁数据行

如果一个update锁定第1,2,3索引块 第二个update也需要锁定第1,2,3索引块

则第二个如果锁的顺序是3,2,1 则可能和第一个update产生死锁
[/Quote]
另外,也是同一数据行才可能死锁的吧?
rorom 2012-09-23
  • 打赏
  • 举报
回复
那我如何判断具体的索引块?
是where条件下的字段吗?
rucypli 2012-09-23
  • 打赏
  • 举报
回复
锁是锁的索引块 并不是锁数据行

如果一个update锁定第1,2,3索引块 第二个update也需要锁定第1,2,3索引块

则第二个如果锁的顺序是3,2,1 则可能和第一个update产生死锁
发帖
MySQL

5.6w+

社区成员

MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
帖子事件
创建了帖子
2012-09-23 02:34
社区公告
暂无公告