2

如果调用回滚,为什么 MySQL 会插入行然后将其删除?

例如,使用以下代码:

declare exit handler for not found rollback;
declare exit handler for sqlwarning rollback;
declare exit handler for sqlexception

BEGIN
select last_insert_id();
rollback;
END;

START TRANSACTION;

INSERT INTO test (text) VALUES ('this_insert_works');
INSERT INTO test (id, text) VALUES (3,'this_insert_fails');

在存储过程的以下代码中,如果我执行它,然后在没有最后一行的情况下再次执行它(它会起作用),我可以看到“缺少 auto_increment ID”,因为该行被插入然后被删除。返回的选择返回一个不存在的 ID。

如何避免这种行为?

4

1 回答 1

3

你无法避免这种行为。

假设您有两个同时运行的事务,它们都将一些记录插入test事务内部。他们的id价值观是什么?如果你提交一个但回滚另一个会发生什么?

唯一可行的选择是增加表的 auto_increment 计数器;由于每个事务都看不到彼此的行(但这些行确实存在于它们各自的事务中),这是确保它们都获得唯一 ID 的唯一方法。

虽然这种行为可能看起来不受欢迎,但它实际上是有充分理由的。唯一的其他选择是在执行事务内部时锁定整个表,防止所有其他连接同时将行插入到该表中。这对性能来说是很糟糕的。INSERT

于 2012-11-11T03:25:49.297 回答