mysql 如果未达到COMMIT TRANSACTION,则自动回滚

q8l4jmvw  于 2023-02-28  发布在  Mysql
关注(0)|答案(6)|浏览(195)
    • 请考虑以下事项:**
START TRANSACTION;

BEGIN;

INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('','production','','300000');

/** Assume there is syntax error SQL here...**/
Blah blah blah

DELETE FROM prp_property1 WHERE environment_name = 'production';

COMMIT TRANSACTION;
    • 问题:**

我注意到事务自动回滚,记录插入尝试失败。
如果我没有像上面那样在ROLLBACK TRANSACTION中提供错误处理程序或错误检查,那么在上面的示例中,由于COMMIT TRANSACTION从未执行过,它似乎正在执行这项工作,这样安全吗?
我假设事务会立即回滚,并在发生错误时立即丢弃。

tkqqtvp1

tkqqtvp11#

不,事务不会在错误发生时立即回滚。但是您可能正在使用应用此策略的客户端应用程序。
例如,如果你使用的是mysql命令行客户端,那么它通常会在出错时停止执行并退出,而在事务正在进行时退出确实会导致事务回滚。
当您编写自己的应用程序时,可以控制回滚策略,但也有一些例外:

  • 退出(即断开与数据库的连接)总是回退正在进行的事务
  • 死锁或锁等待超时会隐式导致回滚

除了这些条件之外,如果您调用了一个生成错误的命令,则错误将正常返回,您可以随意执行任何操作,包括提交事务。

0ejtzxu1

0ejtzxu12#

使用Mysql存储过程

BEGIN

   DECLARE exit handler for sqlexception
      BEGIN
      ROLLBACK;
   END;

   DECLARE exit handler for sqlwarning
     BEGIN
     ROLLBACK;
   END;

   START TRANSACTION;

   INSERT INTO prp_property1 (module_name,environment_name,NAME,VALUE) VALUES ('','production','','300000');

   [ERROR]

   COMMIT;

   END

您可以设置如果警告或错误回滚,那么您不需要删除,与事务所有条目被删除。

aiazj4mn

aiazj4mn3#

您可以使用 * 程序 * 来更有效地执行此操作。
Transaction with Stored Procedure in MySQL Server

muk1a3rh

muk1a3rh4#

我想补充一下@MarkR已经说过的内容。错误处理(假设使用InnoDB引擎)如Mysql Server Documentation中所述

  • 如果表空间中的文件空间不足,则会出现MySQL Table is full错误,InnoDB会回滚SQL语句。
  • 事务死锁会导致InnoDB回滚整个事务。
  • 重复键错误将回滚SQL语句
  • 行太长错误将回滚SQL语句。
  • 其他错误大多数由MySQL代码层(InnoDB存储引擎级别之上)检测到,并且它们回滚相应的SQL语句

我的理解也是当Mysql会话结束时(当php脚本结束时),任何没有提交的东西都会被回滚。我还需要找到一个真正可靠的来源来支持这一说法,所以不要相信我的话。

dhxwm5r4

dhxwm5r45#

我测试了这三种情况mySQL不会自动回滚。
事务死锁导致InnoDB回滚整个事务。重复键错误回滚SQL语句。行过长错误回滚SQL语句。
只有受影响的记录失败,其余记录将成功,除非应用程序显式调用“rollback”。

k3bvogb1

k3bvogb16#

Mysql版本为8.x
热门主题有两点

  1. TRANSACTION
  2. Stored Routines
    我的参考内容:
    默认情况下,MySQL运行时启用了自动提交模式。这意味着,当不在事务中时,每个语句都是原子的,就像它被START TRANSACTION和COMMIT包围一样。您不能使用ROLLBACK来撤消效果;但是,如果在语句执行期间发生错误,则语句将回滚。
    要隐式禁用单个语句系列的自动提交模式,请使用START TRANSACTION语句:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

使用START TRANSACTION时,自动提交保持禁用状态,直到使用COMMIT或ROLLBACK结束事务。然后,自动提交模式恢复到以前的状态。

相关问题