首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用mysql事务时,什么将被锁定?

当我使用mysql事务时,什么将被锁定?
EN

Stack Overflow用户
提问于 2021-06-21 16:21:47
回答 1查看 42关注 0票数 0

我对mysql事务感到困惑。我有一个表格,如下所示。

代码语言:javascript
复制
content  ip              status
aaa      null            wait
bbb      192.168.21.11   processing
ccc      null            wait
ddd      192.168.21.11   processing
eee      192.168.21.12   processing

我在两台不同的机器上运行两个进程来处理这个表。它们中的每一个都在执行以下操作。(1)从表中选择等待内容(2)统计每个ip上的内容并选择内容较少的ip (3)将内容状态更新为正在处理,并设置ip列。

我过去常常使用表锁来避免竞争条件,但它会导致死锁。所以现在我想用事务来代替。但是我对事务的锁定作用域感到困惑。

当两个进程从表中选择等待内容并将其更新为正在处理时,我可以使用"for update“来避免竞争条件。但是,我应该如何避免在计数和更新到处理时发生竞争条件?在上面的示例中,两个进程都得到了带有192.168.21.12的1,并且都选择了它作为进程,则此ip上的内容将为3。

事务中的所有查询是否都是原子执行的,因此不会出现竞争条件?或者mysql只是锁定"select ... for update“和"commit”之间的行?

EN

回答 1

Stack Overflow用户

发布于 2021-06-28 09:31:42

在MySQL Innodb中,当事务提交或回滚时,事务持有的锁被释放。在上述情况下,在步骤1中授予的锁将被持有,直到事务完成。

事务不是原子运行的,如果它们不接触相同的记录,它们可以并发运行,否则,一个事务必须等待另一个事务释放锁。

关于哪些类型的锁将由语句持有,您可以参考Locks Set by Different SQL Statements in InnoDB以了解更多详细信息

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

https://stackoverflow.com/questions/68064675

复制
相关文章

相似问题

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