文章目录
- 概念
- 事务的操作
- 属性(aicd)
概念
一组DML语句,这组语句要一次性执行完毕,是一个整体
为什么要有事务?
为应用层提供便捷服务
事务的操作
有一stu表
# 查看事务提交方式(默认是开启的)
show variables like 'autocommit';
# 设置提交方式
set autocommit=0; # 关闭自动提交
set autocommit=1; # 开启自动提交
# 开始事务
begin; / start transation;
# 提交事务
commit;
# 回滚
rollback;
# 设置回滚点
save point [回滚点名];
属性(aicd)
- 原子性(atomicity)
- 隔离性(isolation)
- 持久性(durablility)
- 一致性(consistency)
原子,隔离,持久 ----> 一致 (aid->c)
这里重点讲一下隔离性的隔离级别,隔离级别体现隔离性。
隔离级别分为四种
类型 | 作用效果 | 存在问题 |
---|---|---|
读未提交【read uncommitted】 | 事务间并行操作,互相影响 | 脏读 |
读提交【read committed】 | 事务提交后互相影响 | 不可重复读 |
(系统默认级别) 可重复读【repeatable read】 | 事务间并发独立执行,全部提交完,才得到结果 | 幻读 |
串行化【serializable】 | 事务串行修改,可并发查询 | 并发读低,效率低 |
在了解隔离级别前,先掌握下面语句
# 查看全局的隔离级别
select @@global.tx_isolation(默认是repeatable)
# 查看本次会话的隔离级别(session.可以省略)
select @@session.tx_isolation # 找全局的进行初始化
# 设置隔离级别
set [session/global] transation isolation level [read uncommitted/read committed/repeatable read/serializable]
- 读未提交
先设置隔离级别为read uncommitted
两个事务同时进行,发现每次查询的结果都不一样,我们把一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,这种现象叫做脏读。
- 读提交
先设置隔离级别为read committed
两个事务同时进行,一个事务提交之后,另一个事务的结果才发生影响
同一个事务内,同样的读取,在不同的时间段(依旧还在事务操作中!),读取到了不同的值,这种现象叫做不可重复读
-
可重复读
先设置隔离级别为 repeatable read
可重复读的隔离性就比较完善了,事务并发执行间的修改会不影响,执行完后得到它们的最终结果。 -
串行化
先设置隔离级别为 serializable
- 不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了
- 幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样。