MySQL设置事务自动提交(开启和关闭)

MySQL设置事务自动提交(开启和关闭)

设置事务自动提交模式。

MySQL 默认开启事务自动提交模式,即除非显式的开启事务(BEGIN 或 START TRANSACTION),否则每条 SOL 语句都会被当做一个单独的事务自动执行。但有些情况下,我们需要关闭事务自动提交来保证数据的一致性。下面主要介绍如何设置事务自动提交模式。

在 MySQL 中,可以通过 SHOW VARIABLES 语句查看当前事务自动提交模式,如下所示:

mysql> SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set, 1 warning (0.04 sec)

结果显示,autocommit 的值是 ON,表示系统开启自动提交模式。

在 MySQL 中,可以使用 SET autocommit 语句设置事务的自动提交模式,语法格式如下:

SET autocommit = 0|1|ON|OFF;

对取值的说明:

  • 值为 0 和值为 OFF:关闭事务自动提交。如果关闭自动提交,用户将会一直处于某个事务中,只有提交或回滚后才会结束当前事务,重新开始一个新事务。
  • 值为 1 和值为 ON:开启事务自动提交。如果开启自动提交,则每执行一条 SQL 语句,事务都会提交一次。
示例

下面的示例我们关闭事务自动提交,模拟银行转账。

  • 使用 SET autocommit 语句关闭事务自动提交,且张三转给李四 500 元,SQL 语句和运行结果如下:
mysql> SET autocommit = 0;                                                      
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |      1000.00 |
| 李四         |         1.00 |
+--------------+--------------+
2 rows in set (0.00 sec)
mysql> UPDATE bank SET currentMoney = currentMoney-500 WHERE customerName='张三' ;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> UPDATE bank SET currentMoney = currentMoney+500 WHERE customerName='李四';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
  • 此时重新打开一个 cmd 窗口,查看 bank 数据表中张三和李四的余额,SQL 语句和运行结果如下所示:
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |      1000.00 |
| 李四         |         1.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

结果显示,张三和李四的余额是事务执行前的数据。

  • 下面在之前的窗口中使用 COMMIT 语句提交事务,并查询 bank 数据表的数据,如下所示:
mysql> COMMIT;
Query OK, 0 rows affected (0.07 sec)
mysql> SELECT * FROM mybank.bank;
+--------------+--------------+
| customerName | currentMoney |
+--------------+--------------+
| 张三         |       500.00 |
| 李四         |       501.00 |
+--------------+--------------+
2 rows in set (0.00 sec)

结果显示,bank 数据表的数据更新成功。

由上述示例可知:

  • 关闭自动提交后,该位置会作为一个事务起点,直到执行 COMMIT 语句和 ROLLBACK 语句后,该事务才结束。结束之后,这就是下一个事务的起点。

  • 关闭自动提交功能后,只用当执行 COMMIT 命令后,MySQL 才将数据表中的资料提交到数据库中。如果执行 ROLLBACK 命令,数据将会被回滚。如果不提交事务,而终止 MySQL 会话,数据库将会自动执行回滚操作。

使用 BEGIN 或 START TRANSACTION 开启一个事务之后,自动提交将保持禁用状态,直到使用 COMMIT 或 ROLLBACK 结束事务。之后,自动提交模式会恢复到之前的状态,即如果 BEGIN 前 autocommit = 1,则完成本次事务后 autocommit 还是 1。如果 BEGIN 前 autocommit = 0,则完成本次事务后 autocommit 还是 0。

<think>好的,我现在需要回答用户关于如何在MySQL开启关闭自动提交功能的问题。首先,我得回顾一下自己对MySQL自动提交的理解。自动提交MySQL的一个设置,决定了每个SQL语句是否自动作为一个事务提交。默认情况下,autocommit是开启的,也就是每个语句执行后都会自动提交,不需要显式的COMMIT命令。 用户的问题是要知道如何启用或禁用这个功能。我记得可以通过设置会话变量autocommit来控制,比如用SET autocommit=0来关闭,用SET autocommit=1来开启。但可能需要确认语法是否正确,以及是否有其他方法,比如在启动事务自动关闭自动提交。 然后,我需要参考用户提供的引用内容。引用[2]提到,不管autocommit是1还是0,使用START TRANSACTION后,需要显式提交或回滚。引用[5]也提到在导入数据时设置autocommit=0以提高效率,之后恢复为1。这说明使用SET autocommit是直接的方法,而START TRANSACTION可能也会影响自动提交的状态,但可能有不同的行为。 接下来,我需要确保回答的结构清晰,分步骤说明如何开启关闭自动提交。可能需要包括两种方法:使用SET语句使用START TRANSACTION。同时,需要指出默认情况下autocommit的状态,以及不同存储引擎可能的影响,比如InnoDBMyISAM的区别。但根据引用[1],禁用键的操作不适用于InnoDB,但自动提交设置应该对所有引擎有效。 此外,用户可能还想知道这些设置的作用范围,是会话级还是全局的。默认情况下,SET autocommit只影响当前会话,而如果要全局更改,需要使用SET GLOBAL。但一般不建议全局修改,除非有特定需求。 还需要提到在事务中autocommit的行为。比如,当启用START TRANSACTION时,autocommit会被暂时禁用,直到事务提交或回滚。这可能是一个需要注意的地方,避免用户混淆。 最后,要检查是否有遗漏的细节,比如如何验证当前autocommit的状态,可以通过SHOW VARIABLES LIKE 'autocommit';来查看。这也是有用的信息,应该包含在回答中。 总结一下,回答的结构应该是: 1. 默认情况下的autocommit设置。 2. 关闭自动提交的方法:SET autocommit=0 或 START TRANSACTION。 3. 开启自动提交的方法:SET autocommit=1。 4. 作用范围注意事项,比如会话级别、事务的影响,以及不同存储引擎的情况。 5. 验证当前设置的命令。 6. 应用场景,如批量插入时关闭自动提交以提高性能。 7. 参考引用中的相关内容,如引用[2][5]提到的使用场景效果。 需要确保语言简洁明了,步骤清晰,并且正确引用相关资料。同时,避免使用过于技术化的术语,让用户容易理解。还要检查是否有语法错误,尤其是关于MySQL命令的正确写法,比如是否有分号,变量名是否正确等。</think>### 如何在MySQL开启关闭自动提交功能? MySQL自动提交(`autocommit`)功能控制每个SQL语句是否自动作为事务提交。以下是详细操作方法: --- #### **1. 查看当前自动提交状态** ```sql SHOW VARIABLES LIKE 'autocommit'; ``` - 默认情况下,MySQL的`autocommit`值为`ON`(即`1`),表示每条语句执行后自动提交[^2][^5]。 --- #### **2. 关闭自动提交** **方法一:通过`SET`语句(会话级生效)** ```sql SET autocommit = 0; -- 关闭当前会话的自动提交 ``` - 执行后,需要手动通过`COMMIT`或`ROLLBACK`提交或回滚事务。 **方法二:使用`START TRANSACTION`** ```sql START TRANSACTION; -- 开启事务,并隐式关闭自动提交 ``` - 执行此命令后,直到显式调用`COMMIT`或`ROLLBACK`,事务才会结束。 --- #### **3. 开启自动提交** ```sql SET autocommit = 1; -- 开启当前会话的自动提交 ``` - 恢复默认行为,每条语句自动提交。 --- #### **4. 全局修改(谨慎操作)** ```sql SET GLOBAL autocommit = 0; -- 修改全局设置(需管理员权限) ``` - 仅建议在特定维护场景下使用,重启后可能失效。 --- #### **注意事项** 1. **事务自动提交的关系** - 使用`START TRANSACTION`后,无论`autocommit`是否为`1`,都需要显式提交事务[^2]。 2. **性能优化场景** - 在批量插入数据时,关闭`autocommit`可减少事务提交次数,提升效率(需配合`COMMIT`)[^5]。 3. **存储引擎差异** - `autocommit`设置对所有引擎(如InnoDB、MyISAM)均有效,但部分优化操作(如`DISABLE KEYS`)仅适用于MyISAM[^1]。 --- #### **验证示例** ```sql -- 关闭自动提交并插入数据 SET autocommit = 0; INSERT INTO employees (emp_no, name) VALUES (1001, 'Alice'); COMMIT; -- 手动提交 -- 开启自动提交 SET autocommit = 1; INSERT INTO employees (emp_no, name) VALUES (1002, 'Bob'); -- 自动提交 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值