我正在开发一个由 MySQL 实例支持的应用程序,并且遇到了一些涉及似乎是“幻影”插入的奇怪行为。
给定一个具有自动递增整数键的表,我执行以下操作:
INSERT ... // generates ID 1
INSERT ... // generates ID 2
INSERT ... // generates ID 3
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;
我猜你可以通过编程来模仿这种行为。