mysql四种隔离级别
mysql 事务有四种隔离级别,分别是:读未提交READ UNCOMMITTED 、读提交 READ COMMITTED、可重复读REPEATABLE READ、串行化SERIALIZABLE。下面我们分别看下不同隔离级别下对事务的影响。
首先查看mysql的隔离级别:
show variables like 'transaction_isolation';
我们看到mysql的默认隔离级别是可重复读,下面设置mysql的隔离级别为读未提交。这里我们只设置当前会话的隔离级别:
set session transaction isolation level READ UNCOMMITTED;
然后我们在数据库中建立这样一张表 staffs:CREATE TABLE `staffs` ( `id` int DEFAULT NULL, `name` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, `age` int DEFAULT NULL, KEY `id_name_age_index` (`id`,`name`,`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
然后预置一部分数据:
读未提交
接下来我们进行一个操作,来演示读未提交的隔离级别。
事务A执行:
BEGIN; select * from staffs where id =1;
得到如下结果:
事务B执行:
BEGIN; select * from staffs where id =1; update staffs set age=11 where id=1;
事务B 执行完update操作后,在事务A中,再查询下id=1的值,如下所示:
可以看到,此时事务A已经读到了事务B的修改,注意此时事务B尚未提交commit。 这个也就是我们所说的脏读。
读已提交
接下来演示下读提交,修改当前会话的隔离级别为READ COMMITTED读提交
set session transaction isolation level READ COMMITTED;
然后按照上面的顺序执行:
发现,在读提交的隔离级别下,当事务B修改完数据尚未提交时,事务A是无法读取到修改的数据的。当事务B提交事务后,事务A才可以看到修改的结果。
可重复读
修改当前会话的隔离级别为可重复读:
set session transaction isolation level REPEATABLE READ;
还按照上面的事务执行顺序执行:
可以发现,当事务B提交后,事务A查询的结果依然是事务A开启时读到的数据,这就是所谓的可重复读,也就是说事务开启时读到的数据,在事务提交前,是一致的,不会因为外面事务的修改提交而改变开启事务前读到的值。
串行化
设置数据库的隔离级别为SERIALIZABLE,然后按照图下的步骤执行操作
当事务A 查询id为1的数据行后,事务B尝试去update id=1的数据行,就会被阻塞住。只有当事务Acommit 后,事务B才执行成功(可以看到步骤2执行了22秒)。当事务A再进行查询ID=1的数据时,发现age还是13,而事务B查询已经变成了14.这是因为事务B还没有提交,对于串行化,对于同一行数据,必须一个事务一个事务顺序执行,当事务B提交后,事务A再查询,就变成了14.

来源:稀土掘金
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!