- 事务
- 指要做或所作的事情,亦指访问并可能更新数据库中各种数据项的一个程序执行单元,事务由事务开始 begin transaction 和 事务结束 end transaction之间的全体操作组成
- MYSQL事务的四大特性 【ACID】及实现原理
- 原子性【Atomicity】:事务作为一个整体被执行,包含在其中的数据库的操作要么全部被执行,要么都不执行
- 一致性【Consistency】:指在事务开始之前和事务结束之后,数据不会被破坏,假如A给B转账10元,不管成功就与否AB的总金额保持不变
- 隔离性【Isolation】:多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果
- 持久性【Durability】:表示事务完成以后,该事务对数据库所作的操作更改,将持久的保存在数据库之中
在事务并发过程中可能会出现的情况:
脏读:一个事务读取了另外一个事务修改但未提交的数据
不可重复读:在一个事务中,多次读取同一数据但结果不同
幻读:一个事务先后读取一个范围的记录,但两次读取的记录个数不同
数据库的四种隔离级别:
低到高:读未提交、读已提交、可重复读、序列化
1.读未提交(一致性最差):一个事务可以读取另一个未提交事务的数据 【可能发生脏读、不可重复读、幻读】
2.读提交【sqlserver/oracle默认级别】(不加锁,使用快照读):只能读已经提交的内容,解决了脏读的现象,但若另一事务更新了数据库则会出现不可重复读和幻读的现象
3.可重复读【mysql默认级别】(事务开启时不允许其它事务的update操作):可以解决不可重复读问题,但不能解决幻读问题,幻读对应insert/delete操作
4.序列化:即事务串行化运行,可解决脏读、不可重复度、幻读,但执行效率低、性能开销大
-
隔离级别的实现原理:
- 使用mysql的默认隔离级别【可重复读】进行说明
- 每条记录在更新的时候都会同时记录一条回滚操作,回滚操作日志 undo log,同一记录在系统中可以存在多个版本,即数据库的多版本并发控制MVCC,通过回滚操作 rollback操作,可以回到前一个状态的值
- 假设一个值从1被按顺序改成了2 3 4,在回滚日志里面就会有类似下面的记录
- 同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。对于 read-view A,要得到 1,就必须将当前值依次执行图中所有的回滚操作得到
ref:
https://www.cnblogs.com/myseries/p/10748912.html
彻底搞懂 MySQL 事务的隔离级别-阿里云开发者社区 (aliyun.com)
(6 封私信 / 11 条消息) MySQL 面试一般常问问题有哪些? - 知乎 (zhihu.com)