1.背景
今天接受海尔的视频面试,第二个问题就是事务的隔离级别,又栽了跟头,貌似在这个问题上不止栽了一次了,面试官似乎也特别喜欢问这个问题,于是乎,集中解决一下。
2.概念
ACID
原子性、一致性、隔离性、持久性
原子性
要么全执行,要么不执行
一致性
比如转账,不能出现A扣钱而B没收到钱
隔离性
事务之间没有干扰,比如A取钱结束钱,B不能向A转账
持久性
事务完成后,所有更新保存到数据库,不能回滚
脏读
事务A读取了事务B更新的数据,然后B回滚,A脏读
不可重复读
事务A多次读取统一数据,在此过程中事务B进行了更新操作,导致事务A多次读取结果不一致
幻读
事务A插入已经检查不存在的数据,发现该数据存在
3.事务隔离级别
a.读未提交
假设事务A读,事务B更新,事务A会读取到B未提交的数据;如事务B回滚,则A读到的是脏数据
b.读已提交
事务A 开启
事务A select
事务B 开启
事务B update
事务A select 此时事务A不能查询到B未提交数据,解决了脏读问题
事务B 提交
事务A select 与第一次select结果不一致,产生了不可重复读问题
c.可重复读
事务A 开启
事务A select id = 1
事务B 开启
事务B insert id = 1 伪代码,插入id为1的数据
事务B 提交
事务A select 此时的select与第一次不会出现不一致的情况
事务A update、insert、delete会按照当前版本,select是历史版本
事务A select id = 1 与第一次结果一致,可重复读
事务A insert id = 1报错,出现幻读问题
d.串行化
事务A 开启
事务A select
事务B 开启
事务B insert 报错,由于串行化会锁表
网友评论