-
将一组SQL放到一个批次中去执行,要么都成功,要么都失败
-
事务原则:ACID原则
- 原子性(Atomicity):要么都成功,要么都失败
- 一致性(Consistency):事务前后的数据完整性要保证一致
- 隔离性(Isolation):多个用户并发访问数据库时,数据库为每个用户开启事务,互不干扰
- 持久性(Durability):事务一旦提交则不可逆,被持久化到数据库中;若未提交,则返回提交前状态
-
隔离所导致的一些问题
- 脏读:一个事务读取到另一个事务未提交的数据
- 不可重复读:在一个事务内,多次读取的结果不同
- 虚读(幻读):在一个事务内读取到别的事务插入的数据,导致前后读取不一致
-
MySQL是默认开启事务自动提交的
-
手动处理事务流程(1-5)
- 关闭自动提交:set autocommit = 0;
- 开启事务:start transaction(标记一个事务的开始,从这个之后的SQL都在同一个事务内)
- 提交(持久化):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; -- 恢复默认