事务
事务是一组操作的集合,是一个不可分割的工作单位:事务会把所有操作作为一个整体一起向系统提交或撤销,这些操作要么同时成功,要么同时失败。
典型场景是转账:张三给李四转 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:建库、建表