前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql事务隔离级别——读已提交

mysql事务隔离级别——读已提交

原创
作者头像
猿码YM
发布2021-11-29 19:20:34
1K0
发布2021-11-29 19:20:34
举报
文章被收录于专栏:mybatis探究mybatis探究

1.数据脏读复现

事务A

事务B

开启事务,设置事务隔离级别为读未提交

查到5条记录

开启事务,插入一条记录id=6 ,事务并未提交

继续查询,查到6条记录(脏数据)

事务回滚

继续查询,查到5条记录

这样在事务A中就出现了脏读数据

2.事务脏读解决:

代码语言:txt
复制
 设置事务隔离为读已提交

事务A

事务B

开启事务,设置事务隔离级别为读已提交

查到5条记录

开启事务,插入一条记录id=6 ,事务并未提交

继续查询,依然查到5条记录(没有读到脏数据)

事务提交

继续查询,依然查到6条记录

3.代码调试:

代码语言:txt
复制
	@Test
	  void test() throws InterruptedException {
	    try (SqlSession session = sqlSessionFactory.openSession(TransactionIsolationLevel.READ_COMMITTED)) {
	//    try (SqlSession session = sqlSessionFactory.openSession(TransactionIsolationLevel.READ_UNCOMMITTED)) {
	      // 开启事务
	      List<User> list = session.selectList("getAllUsers");
	      assertEquals(5, list.size());
	
	      // 开启子线程就相当于开启了一个事务
	      Thread thread1 = startThread();
	
	      // 等待子线程修改数据,但是并没有提交
	      Thread.sleep(1000);
	
	      // 看本次是否读到脏数据
	      List<User> list2 = session.selectList("getAllUsers");
	      assertEquals(5, list2.size());
	
	      // 等待子线程执行结束
	      thread1.join();
	
	      // 暴露了不能重复读取问题
	      List<User> list3 = session.selectList("getAllUsers");
	      assertEquals(6, list3.size());
	    }
	
	  }

4.代码gihub地址

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档