TCL:Transaction Controller Language,事务控制语言
ACID特性,事务隔离级别,事务并发问题
1 事务
1.1 介绍
- 事务是一个完整的业务逻辑单元,不可再分,保证数据的完整和安全
- 多条DML语句需要一次性执行,保证同时成功,同时失败,不存在某一条语句执行成功,另一条语句执行失败
- 举例:转账,A账户转钱,B账户接受前要同时成功或失败。不能A转钱成功,B接受钱失败,导致数据丢失,转走的前丢失
1.2 原理
- 在开启事务的时候,每执行一条DML语句,不会立刻将执行结果保存在硬盘上,而是放在缓存中
- 一旦接受到事务commit指令,才会将缓存中的数据保存在硬盘上,然后关闭事务
- 一旦接收到事务rollback指令,会直接关闭事务,放弃缓存中的数据
1.3 事务特性
- 事务的四大特性:ACID
- A(Atomicity)(原子性): 事务中的所有SQL语句,要么同时成功,要么同时失败
- C(Consistency)(一致性):事务执行前后,数据的总量保持不变
- I(Isolation)(隔离性):事务A与事务B之间相互隔离,独立运行
- D(Durabilily)(持久性):数据持久化到硬盘文件
1.4 事务隔离级别
- 第一级别:读未提交(read uncommitted)
- 存在两个进行中的事务,在对方事务数据未提交时,另一个事务能够读取未提交的数据
- 存在读脏读现象,该数据未提交,一旦该事物的数据最后选择回滚,另一个事务读取到的数据是不存在的数据,称为脏读
- 第二级别:读已提交(read committed)
- 读取的数据只能够是已提交的数据
- 存在不可重复读现象,即两个事物,事物A读取数据后,事务B提交了数据,事务A再次读取数据,读取的数据不一致
- 第三级别:可重复读(repeatable read)
- 解决了不可重复读,只要事务A没有结束,无论事务B怎么提交数据,事务A读取到的数据都是事务开始前的数据
- 存在幻读现象,不可重复读的升级,针对于表。事务A读取了表的数据,事务B新增or删除表的数据,事务A重新读取表的数据,发现行数不一致
- 第四级别:串行化(serializable)
- 不允许事务并发,事务一个接一个运行
- 解决了所有的问题,但是运行效率差
- Oracle默认使用读已提交的隔离级别
- MySQL默认使用可重复读的隔离级别
1.5 TCL语句
1 | # 查询当前MySQL的事务隔离级别 |