使用BEGIN和START TRANSACTION时的MySQL AUTOCOMMIT状态

时间:2012-07-07 14:36:48

标签: mysql transactions autocommit

我需要在我的MySQL项目中使用一个事务。但我不确定是否必须使用mysql_query("SET AUTOCOMMIT=0"); 我知道我有两个选择:

  1. BEGIN
  2. START TRANSACTION
  3. 此外,我听说其中一项不需要使用AUTOCOMMIT = 0 请帮助我知道我必须实际使用AUTOCOMMIT = 0,使用BEGIN还是START TRANSACTION

    谢谢。

1 个答案:

答案 0 :(得分:12)

the manual中所述:

  

默认情况下,MySQL在启用autocommit模式的情况下运行。这意味着只要执行更新(修改)表的语句,MySQL就会将更新存储在磁盘上以使其永久化。无法回滚更改。

     

要为一系列语句隐式禁用自动提交模式,请使用START TRANSACTION语句:

START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;
     

使用START TRANSACTION,在您使用COMMITROLLBACK结束交易之前,自动提交仍会被停用。然后,自动提交模式将恢复为先前的状态。

手册继续说:

  

要显式禁用自动提交模式,请使用以下语句:

SET autocommit=0;
     

通过将autocommit变量设置为零来禁用自动提交模式后,对事务安全表(例如InnoDBNDBCLUSTER的表)的更改不会立即成为永久更改。您必须使用COMMIT将更改存储到磁盘或ROLLBACK以忽略更改。

     

autocommit是会话变量,必须为每个会话设置。要为每个新连接禁用自动提交模式,请参阅autocommit处的Section 5.1.3, “Server System Variables”系统变量的说明。

     支持BEGINBEGIN WORK作为START TRANSACTION的别名来启动交易。 START TRANSACTION是标准的SQL语法,是推荐ad-hoc事务的推荐方法。