我对mysql事务感到困惑。我有一个表格,如下所示。
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”之间的行?
发布于 2021-06-28 09:31:42
在MySQL Innodb中,当事务提交或回滚时,事务持有的锁被释放。在上述情况下,在步骤1中授予的锁将被持有,直到事务完成。
事务不是原子运行的,如果它们不接触相同的记录,它们可以并发运行,否则,一个事务必须等待另一个事务释放锁。
关于哪些类型的锁将由语句持有,您可以参考Locks Set by Different SQL Statements in InnoDB以了解更多详细信息
https://stackoverflow.com/questions/68064675
复制相似问题