七、TCL(事务控制语言)
*TCL(transaction control language):事务控制语言 commit、rollback
事务是MySql服务器提供的一个管理对象,用于对当前表文件备份进行管理
事务四大特性(ACID)
- 原子性(Atomicity):要么成功要么失败
- 一致性(Consistency):一个事务执行的前后,数据库都必须处以一致性状态
- 隔离性(Isolation):并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰
- 持久性(Duration):事务一旦提交后,数据库中的数据必须被永久的保存下来
1、开启一个事务
-- 通知MySql服务器提供一个事务对象,这个事务对象会对接下来的所有操作产生的备份进行管理
start transaction;
2、commit
*提交修改的内容,永久保存
通知MySql服务器将本次操作中所有备份信息进行删除,称之为提交操作
INSERT INTO TEST20200630(testid, testdate, testmemo) VALUES (23, SYSDATE, 'cccc');
COMMIT; -- 插入一条数据提交后即可永久保存
※※※注意:commit后不能回滚,但如果是du9i或以上版本可以使用flashback来找回原来的数据
3、rollback
*撤回没提交的内容
通知MySql服务器将本次操作中所有备份信息覆盖到表文件,以此来取消本次操作
DELETE FROM TEST20200630 WHERE testid=23;
ROLLBACK; -- 误删一条数据后可以回滚,撤销之前的操作
在一个事务中,rollback和commit都代表结束一个事务。要么回滚,要么提交。他们是在一个等级上的命令。rollback可以写在commit之前,但是commit的数据就不能rollback了
4、事务并发问题
1、脏读 ( Dirty Read )
读取了未提交的脏数据(B心说我还妹提交呢,万一跑着跑着滚了呢)
2、不可重复读 ( Unrepeatableread )
一个事务内多次读同一个过程中被其他事务修改的数据(前面计算的时候读的10后面计算的时候变成20了)
3、幻读 ( Phantom Read )
一个事务内多次读同一个条件下过程中被其他事物插入或删除的数据(刚才读还3条呢,一眨眼100条了)
不可重复读和幻读区别:
不可重复读重点在修改
幻读重点在新增或删除
4、事务隔离级别
由低到高分别为:
- 读未提交( Read uncommitted)
- 读提交(Read committed)
- 重复读(Repeatable read)
- 序列化(Serializable)
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
( ×代表没有这个问题,√ 代表存在这个问题 ,一般会使用 Repeatable read)