如何开启事务_mysql事务使用方法

11次阅读

mysql事务需显式开启(START TRANSACTION)并配合COMMIT/ROLLBACK,前提是非自动提交模式(autocommit=0);即使autocommit=1,BEGIN仍可启动事务块;DDL会隐式提交,事务不跨连接,隔离级别影响可见性,长事务应避免。

如何开启事务_mysql事务使用方法

MySQL 中开启事务,核心是用 START TRANSACTION(或 BEGIN)显式启动,再配合 COMMITROLLBACK 控制提交或回滚。默认情况下,MySQL 处于自动提交模式(autocommit=1),每条 SQL 语句都会立即生效,此时事务不起作用——必须先关闭自动提交或显式开启事务。

确认并设置 autocommit 状态

事务生效的前提是当前会话不处于自动提交模式。可通过以下方式检查和调整:

  • 查看当前 autocommit 值:select @@autocommit; —— 返回 1 表示开启,0 表示关闭
  • 临时关闭自动提交:SET autocommit = 0;(当前会话有效)
  • 开启自动提交:SET autocommit = 1;

注意:即使 autocommit=1,仍可用 BEGINSTART TRANSACTION 显式开启事务块,该事务内的语句仍受 COMMIT/ROLLBACK 控制。

标准事务操作流程

一个完整、安全的事务应包含明确的起点、执行逻辑和终点处理:

  • 显式开启:START TRANSACTION;(推荐)或 BEGIN;
  • 执行多条相关 DML 操作(如 INSERT/UPDATE/delete),中间可加业务逻辑判断
  • 全部成功则提交:COMMIT;
  • 任一环节出错或需撤销,则回滚:ROLLBACK;

例如转账场景:
START TRANSACTION;
UPDATE accounts SET balance = balance – 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

若第二条 UPDATE 失败(如主键冲突、字段超长),应手动执行 ROLLBACK 恢复原状。

事务中的常见注意事项

  • DDL 语句会隐式提交:CREATE、ALTER、DROP 等操作执行后,会自动触发 COMMIT,导致之前未提交的事务立即结束
  • 不能跨连接共享事务:事务只在当前数据库连接(session)中有效,其他连接看不到未提交的修改(符合隔离性)
  • 锁与隔离级别影响行为:不同隔离级别(READ COMMITTED、REPEATABLE READ 等)会影响事务间可见性和锁范围,必要时用 SET TRANSACTION ISOLATION LEVEL … 调整
  • 避免长事务:长时间未提交的事务会占用资源、阻塞其他操作,也增加回滚开销

简单验证事务是否生效的小技巧

在命令行或客户端中快速测试:

  • 新开两个窗口,都连同一数据库
  • 窗口 A 执行:START TRANSACTION; UPDATE t SET v=99 WHERE id=1;(不 COMMIT)
  • 窗口 B 执行:SELECT v FROM t WHERE id=1; —— 若看到旧值,说明事务隔离生效
  • 窗口 A 再执行 COMMIT;,窗口 B 刷新查询即可看到新值

这样能直观理解事务的原子性和隔离性。

text=ZqhQzanResources