6 事务
6.1 什么是事务
要么都成功, 要么都失败.
将一组SQL放在一个批次中去执行
InnoDB支持事务
事务原则 : ACID 原则
原子性, 一致性, 隔离性, 持久性
原子性Atomicity: 针对同一个事务,两者都成功或者都失败
一致性Consistency: 最终一致性, 针对一个事务, 操作前与操作后的状态一致.
持久性Durability: 事务没有提交, 恢复到原状; 事务一旦提交, 持久化到数据库. 事务一旦提交就不可逆.
隔离性 Isolation: 针对多个用户同时操作, 主要是排除其他事务对本次事务的影响.
隔离所导致的一些问题:
- 脏读:一个事务读取了另外一个事务没有提交的数据.
- A给B转钱200, 同时C给B转钱100. 两个事务里B的最终钱不一样了.
- 不可重复读: 在一个事务内读取表中的某一行数据, 多次读取结果不同.
- 一个报表 A, B. B第一次是200, 第二次读取是300, 第三次有可能又变成500
- 虚读(幻读) : 是指在一个事务内读取了别的事务插入的数据, 导致前后读取不一致.
- 报表有ABC三条数据, 再读的时候变成了ABCD四条数据
执行事务
mysql是默认开启事务自动提交的.
set autocommit =0; --关闭
set autocommit =1; --开启, 默认
-- 手动处理事务
set autocommit =0;-- 关闭自动提交
-- 事务开启
start transaction -- 标记一个事务的开始, 从这个之后的sql都在同一个事务里面
insert xxx
insert xxx
insert xxx
-- 提交 : 持久化(成功)
commit;
-- 回滚 : 回到原来的样子 (失败)
rollback;
-- 事务结束
set autocommit = 1;
savepoint 保存点名 -- 设置一个事务的保存点
rollback to savepoint 保存点名 -- 回滚到保存点
release savepoint 保存点名 -- 撤销指定的保留点
模拟场景
-- 模拟转账
set autocommit =0;
start TRANSACTION; -- 开启一组事务
update account SET money = money-500 where name = 'A'; -- A减少500
update account SET money = money+500 where name = 'B'; -- b增加500
commit;
ROLLBACK;
SET autocommit =1;