7

考虑这种情况:

  1. 开始交易
  2. 使用 auto_increment 键向表中插入 20 条记录
  3. 获取第一个插入 id(假设它是153
  4. 更新该表中的所有记录id >= 153
  5. 犯罪

第4步安全吗?

也就是说,如果另一个请求几乎同时进来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?

4

2 回答 2

8

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)

于 2010-05-11T07:36:54.153 回答
0

我不认为这可以归类为竞争条件,而是作为 DMBS 特定行为。基本上,如果 DBMS 锁定了新插入的记录,那么在提交第二个事务之前,第一个事务将看不到来自第二个事务的记录。

当然还有锁定表的问题,如果第一个事务对表进行写锁定,那么第二个事务将在写入时被阻塞,直到第一个事务完成。不确定标准 mysql 是否提供这种功能。我知道 MSSQL 服务器确实如此。

于 2013-08-30T19:06:38.150 回答