【问题标题】:MySQL AUTOCOMMIT status while using BEGIN and START TRANSACTION使用 BEGIN 和 START TRANSACTION 时的 MySQL AUTOCOMMIT 状态
【发布时间】:2012-07-07 14:36:48
【问题描述】:

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

  1. 开始
  2. 开始交易

另外我听说这两个项目之一不需要使用AUTOCOMMIT = 0
请帮助我知道我什么时候必须使用AUTOCOMMIT = 0,使用BEGIN 还是使用START TRANSACTION

谢谢。

【问题讨论】:

  • @Random 不幸的是我不得不这样做。我有一个项目用这种方式写了很多行代码,而且很难改变它们。
  • 但是您必须面对这项艰巨的工作才能为您的用户提供安全性
  • @Random 这不是我的问题,我只需要了解有关 MySQL 事务的基础知识。你能回答我的问题吗?

标签: mysql transactions autocommit


【解决方案1】:

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 语法,是启动临时事务的推荐方式。

【讨论】:

  • 谢谢你。我在 MySQL 官方网站上看到过这篇文章。但是我看到有的文章说我们用BEGIN的时候不用设置AUTOCOMMIT = 0,但是用START TRANSACTION的时候一定要设置。关于我说的和这篇文章,你的想法是什么?
  • @eggyal 您的意思是您不需要在使用START TRANSACTION 和/或BEGIN 时需要禁用自动提交?会自动禁用吗?
  • @CMCDragonkai: SET autocommit=0START TRANSACTIONBEGIN 都是等价的——除了事务 结束时 MySQL 的状态(因为它是提交或回滚):如果你有autocommit=0,那么MySQL将自动开始一个新事务(就像START TRANSACTIONBEGIN已经再次发出);而如果您有 autocommit=1(因为发出了其他命令之一),那么 MySQL 将返回自动提交每个语句,并且需要另一个 START TRANSACTIONBEGIN 语句来开始新事务
  • @CMCDragonkai:所以您的问题的答案是“是的,使用START TRANSACTIONBEGIN 时不需要禁用自动提交”。
  • 手册上是这么说的,但这不是我在测试中遇到的行为。我必须在事务之后将自动提交设置回 false,否则我的其他非事务查询不会执行。我正在使用 PHP 5.6.28、mysql 5.1.73 和函数 mysqli_autocommit
【解决方案2】:

Start Transaction 和 SET AUTOCOMMIT=0 之间存在细微差别。 如果 START TRANSACTION 出现在 session 开始,并且 ROLLBACK 后 AUTOCOMMIT 设置为 1(Mysql 开始时启用 AUTOCOMMIT),则 Autocommit 再次静默设置为 1 如果我设置 SET AUTOCOMMIT=0,而不是 START TRANSACTION,显然 ROLLBACK 让 AUTOCOMMIT 禁用

【讨论】:

  • 请考虑重新格式化文本。
猜你喜欢
  • 2011-02-26
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多