MySQL事务复习
1.1事务的概述
- 事务(transaction),一个事务是一个完整的业务逻辑单元,不可再分,
比如:银行账户转账,从A账户向B账户转账,需要执行两条update语句,
一个update增加,
一个update减少,
以上两条update与句,同时成功,同时失败.
不如允许出现一条成功一条失败,
要想保证以上的两条DML语句同时成功,同时失败,那么就需要使用数据库”事务机制”
- 和事务有关的语句只有DML语言,数据库操纵语句,(insert delete update)
为什么?因为这些语句都是与数据库 中的”数据”相关的,
事务的存在是为保证数据的完整性,安全性
- 假如所有的业务只需要一条DML语言,那还需要事务机制吗?
不需要事务了;
但实际情况不是这样的,通常一个事务,”业务”,需要多条DML语言共同联合完成
1.2事务的原理
mysql五大语句
-
DQL数据库查询语句
-
DML数据库操纵语句
-
DDL数据库定义语言
-
TCL(事务:commit rollback) savepoint保存点
-
DCL: (授权)
1.3事务的特性
事务的四大特性ACID
-
A.(Atomicity)原子性:事务是最小的单元,不可被分
-
C(consistency)一致性:事务必须保证多条DML语句同时成功或者失败.
-
I (isolation)隔离性:事务A必须与事务B之间具有隔离相当于线程的
-
D(durability):持久性:持久性是说最终数据必须持久化到硬盘文件之中,事务才算成功的结束
1.4事务的隔离性
关于事务之间隔离性
事务隔离性存在隔离级别,理论上包括4个:
实际上都是二挡起步:
- 第一级别: Read uncommitted(读未提交),当前事务可以读取对方未提交的事务
读取未提交数据会存在脏读(脏读是读取前一事务未提交的脏数据)现象:表示读了脏的数据
- 第二级别: **Read Committed(读已提交)**对方事务已经提交的数据我方可以读取到
读已提交存在的问题是:不可重复读(不可重复读是重新读取了前一事务已提交的数据)
- 第三级别: Repeatable Reads(可重复读)
这种隔离隔离级别解决了:不可重复读
存在问题:读取的数据是幻象
幻读(虚读)指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
- 第四级别(Serializable(串行化)):序列化,串行化读解决了所有问题,
缺点:效率低,需要事务排队
Oracle默认二挡起步,读已经提交
Mysql默认隔离级别,可重复读
1.5 演示事务
Mysql事务是默认情况下自动提交,(什么是自动提交,只要执行任意一条DML语句则提交一次)
首先要设置隔离事务级别
1. read uncommitted(读未提交)
Read uncommitted
打开两个窗口,修改一个事务的数据,一个事务可以查询到,
设置事务的隔离级别
set global transaction isolation level read uncommitted;
查看msyql隔离级别;
select @@global.tx_isolation;
设置完隔离级别,离开一下.
2. read committed(读已提交)
可以读取其他事务提交事务提交的数据(大多数数据库默认的隔离级别)
3. repeatable read(可重复读)
Mysql默认的隔离级别
当我们将当前对话的隔离级别设置为repeatable read的时候,当前对话可以重复读,就是每次读取的结果集都相同,其实是备份了一份数据,出现幻读现象