假设我将模拟MySQL / InnoDB中的自动增量
条件
是否可以仅使用程序逻辑进行模拟,而无需使用表级锁定。 感谢。
答案 0 :(得分:3)
答案 1 :(得分:2)
创建另一个表,其中包含一个存储下一个id值的行和列。然后在原始表上创建一个插入触发器,使第二个表中的值递增,抓取它,并将其用于第一个表上的ID列。您需要注意选择和更新的方式,以确保它们是原子的。
基本上,您在MySQL中模拟Oracle sequence
。但它会导致序列表中单行的锁定,因此可能使它不适合你正在做的事情。
ETA:
另一个类似但可能性能更好的选项是创建第二个“序列”表,它只有一个自动增量PK列而没有其他数据。让您的插入触发器在该表中插入一行,并使用从那里生成的ID来填充原始表中的ID。然后要么让触发器或其他进程定期删除序列表中的所有行来清理它。
答案 2 :(得分:2)
CREATE TABLE sequence (id INTEGER); -- possibbly add a name;
INSERT INTO sequence VALUES (1); -- starting value
SET AUTOCOMMIT=0;
START TRANSACTION;
UPDATE sequence SET id = LAST_INSERT_ID(id+1);
INSERT INTO actualtable (non_autoincrementing_key) VALUES (LAST_INSERT_ID());
COMMIT;
SELECT LAST_INSERT_ID();
甚至是会话安全值,用于检查您获得的ID。确保您的表支持事务,或序列中的漏洞没有问题。
答案 3 :(得分:0)