数据库为什么会有deadlock问题

chichenzhe 2017-04-12 07:51:20
https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlock-example.html

官方例子中的A需要等待B释放X锁. 然后由于B持有X锁所以A,B必有一个要抛出异常.

通过测试我发现,理论上和A是否获取了S锁无关(我有一个程序全是update行为, 也发生了x锁冲突), 只要A获取了X锁,并且还没释放 或者释放较慢 那么B竞争X锁的行为就会引发一个异常.

但是这么设计会不会太极端了呢? 一般的程序语言内存操作的时候会让A,B,C,D,E处于等待. 而mysql选择让A,B,C,D,E的其中4个抛出异常.

如果换一种设计方式, A,B都继续等待,直到其中一方放开锁. 或者由开发人员设置锁等待的超时时间难道不是更好吗?
...全文
185 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
chichenzhe 2017-04-13
  • 打赏
  • 举报
回复
引用 1 楼 rucypli 的回复:
如果互相等待对方的锁 又没法释放自己持有的锁 等待是永久的没用的啊
而且这种X锁竞争居然不能设置超时时间? 比如等待5秒实在拿不到锁才抛异常难道不可以吗?
chichenzhe 2017-04-13
  • 打赏
  • 举报
回复
引用 1 楼 rucypli 的回复:
如果互相等待对方的锁 又没法释放自己持有的锁 等待是永久的没用的啊
但是在各程序语言里这种永久不释放就是程序员的责任啊, 工具不负责为这种事情差屁股. 而且这种给其他4个申请X锁定的客户端抛异常的行为也不恰当吧. 反而会更麻烦. 程序接到这个异常要干一系列事情才能避免丢数据
rucypli 2017-04-13
  • 打赏
  • 举报
回复
如果互相等待对方的锁 又没法释放自己持有的锁 等待是永久的没用的啊

56,678

社区成员

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

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