应使用 START TRANSACTION 而非 BEGIN 开启事务,因其是 SQL 标准语法、语义明确、兼容性好,支持 READ ONLY/READ WRITE/WITH CONSISTENT SNAPSHOT 等修饰符,而 BEGIN 仅是别名且不支持这些扩展,易与存储过程中的 BEGIN...END 块混淆。

START TRANSACTION 是 MySQL 中显式开启事务的首选方式,它比 BEGIN 更灵活、语义更明确,尤其在需要指定事务行为时不可替代。
为什么用 START TRANSACTION 而不是 BEGIN
BEGIN 本质是 START TRANSACTION 的别名,但不支持修饰符;一旦你需要控制事务的访问模式或一致性读行为,BEGIN 就完全失效。比如你写 BEGIN READ ONLY,MySQL 会直接报错 ERROR 1064 (42000) —— 语法错误。
-
START TRANSACTION READ ONLY:强制该事务只能执行SELECT(不含FOR UPDATE或LOCK IN SHARE MODE),对临时表仍可增删改 -
START TRANSACTION WITH CONSISTENT SNAPSHOT:立即创建 Read View,后续SELECT都基于这个快照,避免幻读干扰(注意:仅对REPEATABLE READ隔离级别生效) -
START TRANSACTION READ WRITE:显式声明读写权限,虽是默认行为,但在审计日志或调试中能增强可读性
START TRANSACTION 后必须 COMMIT 或 ROLLBACK 吗
不是“必须”,而是“不提交就白开”。只要没执行 COMMIT 或 ROLLBACK,事务就一直挂着,占用锁、Undo Log 和内存资源。连接断开时,MySQL 会自动回滚未结束的事务,但依赖这个机制属于高风险操作——比如网络抖动导致连接意外中断,你根本不知道哪条语句丢了。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 显式调用
COMMIT才算真正落地,数据才对其他事务可见 -
ROLLBACK会清空当前事务所有变更,包括中间插入的临时数据 - 如果用了
SAVEPOINT,可用ROLLBACK TO sp_name回退到某一步,而不影响整个事务
和 autocommit 设置的关系
START TRANSACTION 会**临时覆盖**当前会话的 autocommit 设置。即使你之前执行过 SET autocommit = 1(默认),只要执行了 START TRANSACTION,接下来的 DML 就不会自动提交,直到你手动 COMMIT 或 ROLLBACK。
- 验证当前状态:运行
SHOW VARIABLES LIKE 'autocommit',值为ON或1表示开启自动提交 - 全局关闭
autocommit(不推荐):SET GLOBAL autocommit = 0,需重启后对新连接生效,且容易引发团队协作混乱 - 安全做法:始终用
START TRANSACTION显式开启,靠它来接管控制权,而不是依赖autocommit的开关
容易被忽略的 InnoDB 依赖和隔离级影响
START TRANSACTION 只在 InnoDB 引擎下有意义。如果你的表是 MyISAM 或 Memory 引擎,执行它不会报错,但 ROLLBACK 完全无效——所有 DML 依然立即生效。
- 确认引擎:查
SHOW CREATE TABLE table_name,看输出里是否含ENGINE=InnoDB - 隔离级别决定 Read View 创建时机:
READ COMMITTED每次SELECT都新建 Read View,REPEATABLE READ则在START TRANSACTION或第一个SELECT时建一次 -
WITH CONSISTENT SNAPSHOT在READ COMMITTED下会被忽略,不触发任何额外行为

















