Jw
首页
技术
英语
首页
技术
英语
  • MySQL

    • MySQL 基础
    • 环境变量配置(PATH)
    • SQL 语法与分类
    • MySQL 数据类型
    • SQL - DDL 数据定义语言
    • SQL - DML 数据操作语言
    • SQL - DQL 数据查询语言
    • SQL - DCL 数据控制语言
    • MySQL 函数
    • SQL 约束
    • SQL 外键约束
    • 多表关系
    • 多表查询(连接查询)
    • 隐式内连接 vs 显式内连接
    • 子查询
    • 多表查询案例
    • 事务
    • 并发事务问题与隔离级别
    • MySQL 体系结构与存储引擎
    • 索引概述
    • 索引结构
    • 索引分类
    • 索引语法
    • SQL 性能分析
    • 索引使用
    • 索引设计原则
    • SQL 优化 - 插入数据与主键优化
    • SQL 优化 - order by 与 group by
    • SQL 优化 - limit / count / update
    • 视图
    • 存储过程
    • 存储过程 - 变量
    • 存储过程 - 流程控制、游标与条件处理
    • 存储函数
    • 触发器
    • 锁概述与全局锁
    • 表级锁
    • 行级锁
    • InnoDB 逻辑存储结构
    • InnoDB 架构
    • 事务原理(redo / undo log)
    • MVCC
    • MySQL 系统数据库
    • MySQL 常用工具
    • 数据备份与导入导出
    • 错误日志与二进制日志
    • 查询日志与慢查询日志
    • 主从复制 - 概述与原理
    • 主从复制 - 搭建
    • Mycat 配置
    • Mycat 垂直拆分与水平拆分
    • Mycat 分片规则
    • Mycat 管理与监控
    • Mycat 读写分离 - 一主一从
    • Mycat 读写分离 - 双主双从

事务

事务是一组操作的集合,是一个不可分割的工作单位:事务会把所有操作作为一个整体一起向系统提交或撤销,这些操作要么同时成功,要么同时失败。

典型场景是转账:张三给李四转 1000,需要「张三 -1000」和「李四 +1000」两步,中间若抛异常,就把张三扣掉的钱回滚回去。

开启事务
├── 查询张三余额
├── 张三余额 -1000
├── 李四余额 +1000
├── 全部成功 → 提交事务
└── 抛异常   → 回滚事务(回到事务开始前的状态)

MySQL 默认是自动提交事务:每执行一条 DML 语句,MySQL 会立即隐式提交事务。

一、事务操作

方式一:设置手动提交

-- 查看事务提交方式(1 = 自动提交,0 = 手动提交)
SELECT @@autocommit;

-- 设置为手动提交
SET @@autocommit = 0;

-- 提交事务
COMMIT;

-- 回滚事务
ROLLBACK;

方式二:显式开启事务

-- 开启事务(两种写法等价)
START TRANSACTION;
BEGIN;

-- 提交 / 回滚事务
COMMIT;
ROLLBACK;

方式二不修改 @@autocommit,只对当前这次事务生效。

转账案例

-- 数据准备
CREATE TABLE account(
    id     INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
    name   VARCHAR(10) COMMENT '姓名',
    money  INT COMMENT '余额'
) COMMENT '账户表';

INSERT INTO account(id, name, money) VALUES (NULL, '张三', 2000), (NULL, '李四', 2000);

-- 恢复数据
UPDATE account SET money = 2000 WHERE name = '张三' OR name = '李四';

-- 转账:张三给李四转 1000
START TRANSACTION;
SELECT * FROM account WHERE name = '张三';                      -- 1. 查询张三余额
UPDATE account SET money = money - 1000 WHERE name = '张三';     -- 2. 张三余额 -1000
-- 若此处程序异常,执行 ROLLBACK 回滚
UPDATE account SET money = money + 1000 WHERE name = '李四';     -- 3. 李四余额 +1000
COMMIT;                                                         -- 提交事务
-- ROLLBACK;                                                    -- 回滚事务

二、事务四大特性(ACID)

特性说明
原子性(Atomicity)事务是不可分割的最小操作单元,要么全部成功,要么全部失败
一致性(Consistency)事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation)数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durability)事务一旦提交或回滚,它对数据库中数据的改变就是永久的

三、速查

SELECT @@autocommit;          -- 查看提交方式(1 自动 / 0 手动)
SET @@autocommit = 0;         -- 改为手动提交

START TRANSACTION;  -- 开启事务(等价 BEGIN;)
COMMIT;             -- 提交事务
ROLLBACK;           -- 回滚事务

相关

  • 并发事务问题与隔离级别:脏读 / 不可重复读 / 幻读与四种隔离级别
  • SQL - DML:增删改数据
  • SQL - DDL:建库、建表
最近更新: 2026/10/9 23:41
Contributors: liujw
Prev
多表查询案例
Next
并发事务问题与隔离级别