2012-07-07 163 views
3

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

  1. BEGIN
  2. START TRANSACTION

我还听说了这两个项目的一个并不需要使用AUTOCOMMIT = 0
请帮我知道我何时需要使用AUTOCOMMIT = 0其实,有BEGIN还是用START TRANSACTION

谢谢。

+0

不使用mysql_ *函数 – 2012-07-07 14:47:00

+0

@随机我不得不这样做。我有一个用这种方式编写的许多代码行,并且很难改变它们。 – 2012-07-07 14:48:42

+0

但是你必须面对这个艰巨的工作来为你的用户提供安全 – 2012-07-07 14:50:08

回答

9

the manual解释说:

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

隐含禁用自动提交模式单一系列的语句,使用START TRANSACTION声明:

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] 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语法,并且是启动临时事务的推荐方式。

+0

谢谢eggyal。我在MySQL官方网站上看到过这篇文章。但是当我们使用'BEGIN'时,我看到一些文章,我们不需要设置'AUTOCOMMIT = 0',但是当我们使用'START TRANSACTION'时,我们必须这样做。关于我所说的和这篇文章,你的想法是什么? – 2012-07-07 18:21:47

+0

@MohammadSaberi:从手册中可以很清楚地看到,当使用BEGIN或START TRANSACTION的任意一种时,不需要设置autocommit = 1。但是,如果您没有'SET autocommit = 1',那么您必须确保在每次事务处理之前显式调用'START TRANSACTION'或'BEGIN'。 – eggyal 2012-07-07 18:32:03

+0

@eggyal你的意思是你**不需要在使用'START TRANSACTION'和/或'BEGIN'时不需要禁用自动提交?它会被自动禁用? – CMCDragonkai 2015-06-17 15:04:58

相关问题