2011-05-25 62 views
15

考虑以下几点:自动回滚,如果COMMIT TRANSACTION没有达到

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从未得到执行?

我假设事务立即回滚并在发生错误时立即丢弃。

+0

我正在使用SQLyog作为客户端。 – Koekiebox 2011-05-25 09:22:58

+0

请参阅http://stackoverflow.com/questions/6121917/automatic-rollback-if-commit-transaction-is-not-reached/32955274#32955274 – 2015-10-13 12:40:14

回答

21

不,事务一旦发生错误就不会回滚。但是您可能正在使用应用此策略的客户端应用程序。

例如,如果您使用的是mysql命令行客户端,那么在发生错误时它通常会停止执行并将退出。在事务处理过程中退出会导致它被回滚。

当你编写自己的应用程序,你可以控制在回退的政策,但也有一些例外:

  • 退出(即从数据库断开连接)总是在进步回滚事务
  • 死锁或锁定等待超时隐含地回滚比这些条件

其他,如果你调用产生错误的命令,则返回错误是正常的,你可以自由地做任何你喜欢的,其中包括合作无论如何都要收集交易。

+2

与文档混淆:“回滚可能是一个缓慢的操作,可能发生隐含地没有用户明确地要求它(例如,当发生错误时)。“ :-S – zerkms 2011-05-25 09:13:33

+0

文档不清楚;也许这意味着我在上面提到的情况? – MarkR 2011-05-25 12:30:36

+0

@zerkms ...可能发生...... – 2013-06-30 14:10:39

4

使用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 

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

4

我想补充@MarkR已经说过的话。错误处理,假设InnoDB引擎,如发生在Mysql Server Documentation

  • 如果你在一个表空间用完文件空间描述,一个MySQL表是发生完整的错误和InnoDB回滚的SQL语句。
  • 事务死锁导致InnoDB回滚整个事务。
  • 重复键错误回滚SQL语句
  • 行太长错误回滚SQL语句。
  • 其他错误大多是由代码的MySQL层(InnoDB存储引擎级别以上)探测,它们回滚相应的SQL语句

我的理解也是当Mysql的会话结束(当PHP脚本结束时),任何未提交的内容都会回滚。我还没有找到一个真正可靠的消息来源来支持这个声明,所以不要拿我的话来说。

相关问题