【发布时间】:2021-06-28 09:31:41
【问题描述】:
我对 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”来避免竞争条件。但是我应该如何避免在计数和更新到处理时发生争用情况?在上面的例子中,两个进程都得到 1 和 192.168.21.12 并且都为进程选择它,那么这个 ip 上的内容将是 3。
事务中的所有查询是否都以原子方式执行,从而不会出现竞争条件?或者mysql只是锁定“select ... for update”和“commit”之间的行?
【问题讨论】:
-
您在表定义中使用的是哪个引擎?
-
我正在使用innodb。