考虑这种情况:
- 开始交易
- 使用 auto_increment 键向表中插入 20 条记录
- 获取第一个插入 id(假设它是
153
) - 更新该表中的所有记录
id >= 153
- 犯罪
第4步安全吗?
也就是说,如果另一个请求几乎同时进来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?
考虑这种情况:
153
)id >= 153
第4步安全吗?
也就是说,如果另一个请求几乎同时进来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?
That is, if another request comes in almost precisely at the same time, and inserts another 20 records after step 2 above, but before step 4, will there be a race condition?
Yes, it will.
Records 21
to 40
will be locked by the transaction 2
.
Transaction 1
will be blocked and wait until transaction 2
commits or rolls back.
If transaction 2
commits, then transaction 1
will update 40
records (including those inserted by transaction 2
)
我不认为这可以归类为竞争条件,而是作为 DMBS 特定行为。基本上,如果 DBMS 锁定了新插入的记录,那么在提交第二个事务之前,第一个事务将看不到来自第二个事务的记录。
当然还有锁定表的问题,如果第一个事务对表进行写锁定,那么第二个事务将在写入时被阻塞,直到第一个事务完成。不确定标准 mysql 是否提供这种功能。我知道 MSSQL 服务器确实如此。