脏读
比如 user 表中有一条用户数据,执行了如下操作:
- 事务B更新 id=1 的数据,age 更新为18,不提交事务
- 事务A查询 id=1 的数据
- 事务B回滚刚才的更新操作
这个时候,事务A中查询出的 id=1 的数据,age 的值是16还是18?
不可重复读
比如 user 表中有一条用户数据,执行了如下操作:
- 事务A查询 id=1 的数据
- 事务B更新 id=1 的数据,age 更新为18,并提交事务
- 事务A再次查询 id=1 的数据
这个时候,事务A两次查询出的 id=1 的数据,age 的值是16还是18?
幻读
比如在 user 表中执行了如下操作:
- 事务A查询 age>15 的数据
- 事务B新增一条数据,age=22,并提交事务
- 事务A再次查询 age>15 的数据
这个时候,事务A两次查询出的数据,数量是1条还是2条?
事务四种隔离级别
SQL92 ANSI/ISO标准:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
Read Uncommitted(未提交读) –未解决并发问题
事务未提交对其他事务也是可见的,脏读(dirty read)
Read Committed(提交读) –解决脏读问题
一个事务开始之后,只能看到自己提交的事务所做的修改,不可重复读(non repeatable read)
Repeatable Read(可重复读) –解决不可重复读问题
在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题
Serializable(串行化) –解决所有问题
最高的隔离级别,通过强制事务的串行执行
InnoDB 引擎对隔离级别的支持程度
事务隔离级别的并发能力:未提交读 > 已提交读 > 可重复读 > 串行化
InnDB 引擎默认的事务隔离级别是可重复读(Repeatable Read),在该级别中它把幻读的问题也解决了。InnDB 中事务隔离级别通过锁、MVCC 实现。
通过如下语句查看 InnoDB 的默认事务隔离级别:
/* 全局、当前会话的隔离级别 */
SELECT @@global.tx_isolation, @@tx_isolation;
通过如下语句设置 InnoDB 的事务隔离级别:
/* 设置全局隔离级别 /
set global transaction isolation level read committed;
/ 设置当前会话的隔离级别 */
set session transaction isolation level read committed;
接下来我们来测试一下 InnoDB 的默认事务隔离级别(Repeatable Read)是否解决了脏读、不可重复读、幻读的问题。
数据准备:
CREATE TABLE user
(
id
int(11) NOT NULL,
name
varchar(32) NOT NULL,
age
int(11) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into user
(id
, name
, age
) values(‘1’,‘Ada’,‘16’);
是否解决了脏读的问题?
开启两个 MySQL 客户端,模拟事务A和事务B的操作,执行步骤如下:
- 事务B开启手动事务,更新 id=1 的数据,age 更新为18,不提交事务
- 事务A查询 id=1 的数据
- 事务B回滚刚才的更新操作
图中的数字是执行步骤,通过下图可以看出事务A的执行结果是16,InnDB 的默认事务隔离级别完美的解决了脏读的问题。
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!

最后
手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友
3%;" />
最后
手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友
[外链图片转存中…(img-erbpgYob-1711403875034)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!