我如何强制执行原子插入?

我如何强制执行原子插入?

我正在开发一个由 MySQL 实例支持的应用程序,并且遇到了一些涉及似乎是“幻影”插入的奇怪行为。

给定一个具有自动递增整数键的表,我执行以下操作:

  1. INSERT ... // generates ID 1
  2. INSERT ... // generates ID 2
  3. INSERT ... // generates ID 3
  4. SELECT * // returns the set of elements 1 and 3

似乎第二次插入在插入完成之前生成了一个 ID 并返回到客户端,因此我可以同时知道 ID 并且还不能选择数据。这令人惊讶 - 我认为插入直到插入行后才会返回。

有没有办法告诉 MySQL 在一次原子操作中分配一个 ID 并插入一行,这样,一旦我知道了 ID 2,就保证从选择查询中返回?

答案1

我经常使用的缓解此问题的技巧是创建一个存储例程,并确保它是原子的,方法是使用以下命令:

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
     [your queries here]
COMMIT;

我猜你可以通过编程来模仿这种行为。

相关内容