07 TCL(事务控制语言)
一、什么是事务
-
定义:一个事务是一个完整的业务逻辑单元,不可再分。
例如:银行转账,从A账户向B账户转账1000,需要执行两条update语句:update t_act set balance=balance+1000 where actno='act_001'; update t_act set balance=balance+1000 where actno='act_002';
为了保证上面的DML语句同时成功或失败我们需要使用数据库的“事务机制”。
-
与事务有关的语句只有:DML语句(insert update delete)
事务的存在是为了保证数据的完整性,安全性。
二、事务的执行流程
- 开启事务机制(开始)
- 执行多条 DML 语句
- 提交事务或者事务回滚
注意:
- 提交事务:如果在DML语句全部执行成功,则提交事务、清空历史记录并改变磁盘文件
- 事务回滚:如果DML语句有一条执行失败,则事务回滚、清空历史记录当不改变磁盘文件
示例:
/*在MySQL数据中开启了自动提交机制,需要关闭自动提交*/
start transaction;
/*执行多条DML语句*/
insert into t_stu values (1001,'zs1',101);
insert into t_stu values (1002,'zs2',102);
insert into t_stu values (1003,'zs2',102);
insert into t_stu values (1004,'zs3',101);
select * from t_stu;
/*最后提交事务关闭*/
commit;
三、事务的四大特性
事务包括四大特性:ACID
A:原子性:事务是最小的工作单元,不可再分
C:一致性:事务必须保证多条DML语句同时成功或者同时失败
I:隔离性:事务A与事务B之间具有隔离
D:持久性:最终数据必须持久化到硬盘文件中,事务才算成功的结束
四、关于事务之间的隔离性
事务的隔离性存在隔离级别,理论上隔离级别包括4个:
-
第一级别:读未提交(read uncommitted)
- 对方事务还没有提交,我们当前事务就可以读取到对方未提交的数据。
- 读未提交存在脏读现象
-
第二级别:读已提交(read committed)
- 对方数据提交之后的数据我方可以读取到
- 这种隔离级解决了脏读现象
- 读已提交存在的问题:不可重复。
-
第三级别:可重复度(repeatable read)
- 这种隔离级别解决了不可重复读问题
- 这种隔离级别存在的问题:读到的数据是幻象
-
第四级别:序列化读/串行化读(serializable)
- 解决所有问题
- 缺点:效率低,需要排队
-
注意:
- mysql数据库的默认隔离级别是:可重复读
- Oracle数据库的默认隔离级别是:读已提交
五、更改事务的隔离级别
- 进入指定数据库,使用命令:
use [数据库名称]
- 修改事务隔离级别,使用命令:
set global transaction isolation level [隔离级别类型]
/*设置第一级别*/ set global transaction isolation level read uncommitted; /*设置第二级别*/ set global transaction isolation level read committed; /*设置第三级别*/ set global transaction isolation level repeatable read; /*设置第四级别*/ set global transaction isolation level serializable;