请教个 InnoDB deadlock 问题

2016-04-02 18:34:44 +08:00
 fff333
表是 InnoDB ,每次更新会 update 大约 200 多行。
每次都开了事务基本的逻辑如下:
1 获取 Redis lock
2 得到锁后,开启 transaction
3update 大概 200 列
4 transaction commit
5 释放 Redis lock
返回结果给调用者

用了 Redis 分布锁,所以不会出现 2 个 thread 同时开事务,同时 update 的情况。但是代码还是会报如下 exception :
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get
请问下,这种错误是因为什么?
2524 次点击
所在节点    MySQL
6 条回复
Mirana
2016-04-02 19:19:12 +08:00
还会有别的程序操作这个表吗
tabris17
2016-04-02 19:20:34 +08:00
你 update 的数据被其他的 connection 锁住了
yangdehua
2016-04-02 19:23:41 +08:00
执行 show engine innodb status\G 贴上来
fff333
2016-04-02 20:26:21 +08:00
@Mirana 没有 update ,会有别的地方 select
Mirana
2016-04-02 22:05:32 +08:00
@fff333 事务有四个级别,设置成允许脏读看看
fff333
2016-04-03 11:59:28 +08:00
@Mirana 请教下,如果加了锁,还需要开 transaction 么?是不是 transaction 可以避免多线程 update 的时候有 Optimistic Lock Exception?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/268149

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX