MySQL 带有回滚事务 : is real?

标签 mysql stored-procedures transactions

为什么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”,因为该行被插入然后被删除。返回的 select 返回一个不存在的 ID。

如何避免这种行为?

最佳答案

您无法避免这种行为。

假设您有两个并发运行的事务,它们都将一些记录插入事务内的 test 中。它们的 id 值是多少?如果您提交一个但回滚另一个会发生什么?

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

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

关于MySQL 带有回滚事务 : is real?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13328297/

相关文章:

mysql - 一般意义上的 h2 与 hibernate 和 MySql 之间的区别

php - Angular 6/PHP 解析期间 Http 失败

php - 第二次调用存储过程导致错误 SQLSTATE[HY000] : General error: 2014 Cannot execute queries in zf2

mysql - 如何在 MySQL 中创建矢量类型的字段?

php - mysqli_fetch_array 只显示第一个结果

c# - 将标量从 SQL Server 返回到 C#

MySQL 存储过程语法

php - mysql事务中的更新——隔离

sql-server - DBCC SHRINKFILE 会终止事件事务吗?

java - 事务传播如何影响数据库中的更新