TCL事务控制语言
什么是事务
- 一个或一组sql语句组成的一个执行单元(全部执行或全部不执行)
- 如果单元中某一语句出错,整个单元则会回滚
事务的acid属性
- 原子性:事务不可再分割
- 一致性:数据库从一个一致性状态转换到另一个一致性状态
- 隔离性:一个事务执行不受其他事务干扰
- 持久性:事务一旦提交,数据库更改是永久性的
事务的创建
- 隐式事务:例如常见单句操作语句
- 显式事务:明显开启结束标记(合起来成为一条事务)
设置自动提交功能
set autocommit=0
关闭自动提交,不会立刻执行语句,故显式事务得以实现
语法
#1开启事务
SET autocommit=0
START TRANSACTION
#2编写
语句1;
语句2;
...
#3结束
COMMIT #或者提交事务
ROLLBACK #或者回滚事务
在结束之前,数据保存在内存,只有结束标记检测,才会进一步处理(回滚或者提交到文件系统)
数据库的隔离级别
要了解隔离等级这一概念,首先需要引入并发问题:
- 脏读:事务1事务2,事务1读取了被事务2更新但未提交的字段,若事务2回滚,事务1读取的内容是临时、无效的
by the way 电脑的迅雷抽风了
- 不可重复读:事务1事务2,事务1读取了字段,事务2更新了该字段,事务1再次读取同一字段,值出现了变化
- 幻读:两个事务,事务1读取字段,事务2插入了新行,之后事务1再次读取,多了几行
避免并发问题,设置事务的隔离级别
mysql支持4中事务隔离级别,默认为repeatable read
回滚点
类似于游戏的存档
set autocommit=0;
start trasaction;
delete from account where id=25;
savepoint a #设置为a的保存点
delete from account where id=29;
rollback to a; #回滚至a(后面不会执行)
视图
create view