首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL不打开事务,不同SQL之间是否存在死锁?

MySQL不打开事务,不同SQL之间是否存在死锁?
EN

Database Administration用户
提问于 2022-12-17 16:38:22
回答 1查看 61关注 0票数 1

2并发不启动事务。

并发A依次锁1-3-5,当然,实际的锁定过程必须是由one.Concurrent B锁5-8-1顺序进行的,当然,实际的锁定过程必须是一个接一个的。(1-3-5和5-8-1是主键)

假设当并发A锁到1-3,并发B锁到5-8,并发A锁5和等待,并发B锁1和wait.Is有可能导致死锁吗?

如果是这样的话,为什么MySQL不自动提供并发退出锁以避免死锁?

假设事务被打开,这个机制肯定是不允许的,因为结果已经在transaction.If中返回--不打开事务,原则上是可以的。

EN

回答 1

Database Administration用户

发布于 2022-12-18 06:51:09

您可以得到一个死锁;您不能总是避免它。但你可以恢复。

线程A:

代码语言:javascript
运行
复制
BEGIN;  -- Yes, you must start a transaction
lock row with id=1
lock row with id=5
...
COMMIT;

线程B:

代码语言:javascript
运行
复制
BEGIN;
lock row with id=5
lock row with id=1
...
COMMIT;

这是典型的死锁示例。

如果线程A抓取第1行,在线程B抓取第5行之后到达第5行,则每个线程都在等待另一行。

InnoDB很聪明,可以看到没有办法解决问题,所以它选择了一个事务来终止。在这样做的过程中,它取消了该事务已经完成的任何操作。同时,另一个线程可以继续。

因此,如果在每个语句(甚至是COMMIT)之后检查错误,就会捕获死锁。在这一点上,通常需要做的‘正确’事情是简单地重新启动事务(因为线程有死锁)。

( BEGINCOMMIT之间的事务)是“锁定行”所必需的。所以,我不明白你所说的没有交易的锁定是什么意思。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/321115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档