0%

【MySQL】事务&TCL

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查询当前MySQL的事务隔离级别
select @@transaction_isolation;


# 设置当前窗口的MySQL事务隔离级别
set transaction isolation level 隔离级别(read uncommitted ...);


# 设置数据库MySQL全局事务隔离级别
set global transaction isolation level 隔离级别;


# 开启事务
start transaction;


# 事务提交
commit;


# 事务回滚
rollback;