TCL语言的学习
TCL事务控制语言
事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
引入:
张三丰有1000元,郭襄也有1000元,三丰要给郭襄转500元,这要执行两条语句,三丰钱-500,郭襄钱+500
update 表 set 三丰的余额=500 where name=‘张三丰’
这两条语句中间出现了意外,这时三丰的钱少了500,而郭襄的钱没有多。这500不翼而飞了,这时三丰用事务来解决
update 表 set 郭襄的余额=1500 where name = ‘郭襄’
事务的特性ACID
- 原子性:一个事务不可再分割,要么都执行要么都不执行
- 一致性:一个事务执行会使数据从一个一致状态切换到另一个一直状态
- 隔离性:一个事务的执行不受其他事务的干扰
- 持久性:一个事务一旦提交,则会永久的改变数据库的数据
事务的创建
隐式事务:事务没有明显的开启和结束的标记
比如一条insert、update、delete语句
显示事务:事务具有明显的开启或结束的标记
前提:必须先设置自动提交功能为禁用
set autocommit= 0;
步骤1:开启事务
set autocommit = 0;#写了这条语句就默认开启了事务
start transaction; #这条语句可选
步骤2:编写事务中的sql语句(select、insert、update、delete)
语句1;
语句2;
...
步骤3:结束事务
commit; #提交事务
或
rollback; #回滚事务
或
savepoint 节点名; #设置保存点
事务导致并发问题
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
- 读脏数据:对于两个事务T1、T2,T1读取了已经被T2更新但没有提交的字段。之后,若T2回滚,T1再读取就读到的是原数据,T1刚才(T2更新但没提交时)读取的内容就是临时且无效的
- 不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段且提交。之后,T1再次读取同一字段,值就不同了。
- 幻读:对于两个事务T1、T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行
事务的隔离级别
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | 会 | 会 | 会 |
read committed | 不会 | 会 | 会 |
repeatable read | 不会 | 不会 | 会 |
serializable | 不会 | 不会 | 不会 |
savepoint的使用
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id = 25;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id = 29;
ROLLBACK TO a; #返回到保存点