前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:MySQL的事务隔离级别你了解吗?

面试官:MySQL的事务隔离级别你了解吗?

作者头像
小熊学Java
发布2023-07-16 14:39:53
1460
发布2023-07-16 14:39:53
举报
文章被收录于专栏:全栈学习之路全栈学习之路
  • 未提交读 - 读到其它事务未提交的数据(最新的版本)
    • 错误现象:有脏读、不可重复读、幻读现象
  • 提交读(RC) - 读到其它事务已提交的数据(最新已提交的版本)
    • 错误现象:有不可重复读、幻读现象
    • 使用场景:希望看到最新的有效值
  • 可重复读(RR) - 在事务范围内,多次读能够保证一致性(快照建立时最新已提交版本)
    • 错误现象:有幻读现象,可以用加锁避免
    • 使用场景:事务内要求更强的一致性,但看到的未必是最新的有效值
  • 串行读 - 在事务范围内,仅有读读可以并发,读写或写写会阻塞其它事务,用这种办法保证更强的一致性
    • 错误现象:无
1、脏读现象

tx1

tx2

set session transaction isolation level read uncommitted;

start transaction;

select * from account;/两个账户都为 1000/

start transaction;

update account set balance = 2000 where accountNo=1;

select * from account;/1号账户2000, 2号账户1000/

tx2 未提交的情况下,tx1 仍然读取到了它的更改,此时与第一次读取的数据不一致,则是产生了脏读

2、不可重复读现象

tx1

tx2

set session transaction isolation level read committed;

start transaction;

select * from account; /两个账户都为 1000/

update account set balance = 2000 where accountNo=1;

select * from account; /1号账户2000, 2号账户1000/

tx1 在同一事务内,两次读取的结果不一致,当然,此时 tx2 的事务已提交

3、幻读现象

tx1

tx2

set session transaction isolation level repeatable read;

start transaction;

select * from account; /存在 1,2 两个账户/

insert into account values(3, 1000);

select * from account; /发现还是只有 1,2 两个账户/

insert into account values(3, 5000); /* ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY' */

tx1 查询时并没有发现 3 号账户,执行插入时却发现主键冲突异常,就好像出现了幻觉一样

4、使用 for update 避免幻读现象

tx1

tx2

set session transaction isolation level repeatable read;

start transaction;

select * from account; /存在 1,2 两个账户/

select * from account where accountNo=3 for update;

insert into account values(3, 1000); /* 阻塞 */

insert into account values(3, 5000);

  • 在 for update 这行语句执行时,虽然此时 3 号账户尚不存在,但 MySQL 在 repeatable read 隔离级别下会用间隙锁,锁住 2 号记录与正无穷大之间的间隙
  • 此时 tx2 想插入 3 号记录就不行了,被间隙锁挡住了
5、串行读避免幻读

tx1

tx2

set session transaction isolation level serializable;

start transaction;

select * from account; /* 存在 1,2 两个账户 */

insert into account values(3, 1000); /* 阻塞 */

insert into account values(3, 5000);

串行读隔离级别下,普通的 select 也会加共享读锁,其它事务的查询可以并发,但增删改就只能阻塞了

如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小熊学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、脏读现象
  • 2、不可重复读现象
  • 3、幻读现象
  • 4、使用 for update 避免幻读现象
  • 5、串行读避免幻读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档