我们都知道数据库隔离级别有4种,分别为读未提交、读已提交、可重复读、串行化。其实Spring也可以设置数据库隔离级别。

Spring事务隔离级别比数据库事务隔离级别多一个default

1) DEFAULT (默认)
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。

2) READ_UNCOMMITTED (读未提交)
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。

3) READ_COMMITTED (读已提交)
保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。

4) REPEATABLE_READ (可重复读)
这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻读(mysql已经通过采用next-key锁解决了幻读问题)。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。

5) SERIALIZABLE(串行化)
这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻读。

Spring的@Transactional注解的isolation属性可以设置隔离级别,它提供了以下枚举对应各个隔离级别

public enum Isolation {DEFAULT(-1),READ_UNCOMMITTED(1),READ_COMMITTED(2),REPEATABLE_READ(4),SERIALIZABLE(8);private final int value;private Isolation(int value) {this.value = value;}public int value() {return this.value;}
}

下面我们通过代码来验证下

import com.wpw.group.springstudy.sql.User;
import com.wpw.group.springstudy.sql.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
public class TransactionService {@Autowiredprivate UserMapper userMapper;//由于 @Transactional 采用的是代理模式,采用this调用不会生效,所以这里通过自引用的方式来调用。@Autowiredprivate TransactionService transactionService;/*** 由于远程调用的是 方法是读未提交的,所以会返回数据* @return*/@Transactionalpublic User readUncommitIsolation() {User user = new User();user.setName("name");user.setSex("sex");userMapper.insertSelective(user);return transactionService.getReadUncommit(user.getId());}/*** 采用的是读未提交隔离级别,调用这个方法的会读取到未提交的事务* @param id* @return*/@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED)public User getReadUncommit(Long id) {return userMapper.selectByPrimaryKey(id);}/*** 远程调用的是 默认隔离级别的方法,即可重复读,因此此处会返回null* @return*/@Transactionalpublic User defaultIsolation() {User user = new User();user.setName("name");user.setSex("sex");userMapper.insertSelective(user);return transactionService.getDefault(user.getId());}/*** 未配置隔离级别,会使用默认隔离级别,即数据库默认的事务隔离级别,mysql的默认的隔离级别是 可重复读,所以调用这个方法不会返回数据* @param id* @return*/@Transactional(propagation = Propagation.REQUIRES_NEW)public User getDefault(Long id) {return userMapper.selectByPrimaryKey(id);}
}

如上代码中,我在入口方法readUncommitIsolation()和defaultIsolation()中,都插入了一条数据,之后调用不同隔离级别的方法来获取这条数据。readUncommitIsolation()调用的是isolation = Isolation.READ_UNCOMMITTED即读未提交隔离级别的方法,defaultIsolation()调用的是没有配置隔离级别的方法,即会采用我的mysql默认的隔离级别。需要注意的是,为了新开一个事务进行查询,我将两个查询的方法的传播级别都设置成了propagation = Propagation.REQUIRES_NEW,来重新开启一个事务。

通过Controller来调用service的方法:

@RestController
@RequestMapping("/tr")
public class TransactionController {@Autowiredprivate TransactionService transactionService;@GetMapping("/readUnIsolation")public User readUn() {return transactionService.readUncommitIsolation();}@GetMapping("/defaultIsolation")public User defaultIsolation() {return transactionService.defaultIsolation();}
}

启动程序后

请求:http://127.0.0.1:8080/tr/readUnIsolation ,即会调用未提交隔离级别的查询,每次都会返回插入的数据

请求:http://127.0.0.1:8080/tr/defaultIsolation 即会调用默认隔离级别的查询,不会返回数据

由此可见,Spring事务隔离级别与MySQL设置的级别不一样时,Spring的隔离级别生效

Spring事务隔离级别与设置相关推荐

  1. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务:  事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种):  原子性 (atomicity):强调事务的不可分割: 一致性 (consi ...

  2. Spring事务隔离级别与数据库隔离级别不一致时,该以谁为准?

    原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 前言 通过本篇,你将了解到[Spring事务]与[数据库事务]的关系,以及优先级问题,我将为你一一论证. 阅读本篇,你可能会需要的博文: ...

  3. spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

  4. spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战

    一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...

  5. spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...

    146.简介一下Spring支持的数据库事务传播属性和隔离级别 介绍Spring所支持的事务和传播属性之前,我们先了解一下SpringBean的作用域,与此题无关,仅做一下简单记录. 在Spring中 ...

  6. spring事务隔离级别与数据库事务隔离级别的关系

    一直没搞清楚spring事务与数据库事务与锁之间的关系. spring事务: spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spri ...

  7. mysql 事务补偿_TCC补偿性策略_彻底学习数据库事务 seata分布式事务 共享 排它锁 死锁 索引 Spring事务 隔离级别等_MySQL视频-51CTO学院...

    课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程.对于难以理解的知识点,全部用画图+实战的方式讲解. 彻底明白事务的四个特性:原子性.一致性.隔离性.持久性,用 ...

  8. mysql事务隔离级别与设置

    mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...

  9. Spring事务隔离级别,事务传播行为

    什么是事务:  事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. Spring事务的隔离性(5种) 在讲隔离界别前,我们先来讲讲下基础知识 事务的特性(ACID) 原子性 ...

最新文章

  1. java中gc的认识,java JVM GC 笔记(个人对GC 或JVM 的了解)
  2. Form表单基础知识和常用兼容方法笔记(二)
  3. linux 文件列添加字段,如何在linux中加入所需列的文件?
  4. 实例解析网络编程中的另类内存泄漏
  5. Java开发新手经常遇到的一些问题
  6. 机器学习分类算法_Python机器学习之K近邻分类算法(四)
  7. 中文核心期刊目录(2008年最新版)
  8. Java实习日记(day1)
  9. GBASE 8s UDR内存管理_05_mi_free
  10. 抱歉,当前存在网络问题或服务器繁忙错误代码:20003问题解决方法
  11. 流体动力润滑(轴承油膜承载机理)
  12. 基于微信小程序的宠物医院诊所小程序源码
  13. matlab温度等值线图函数,matlab等值线图
  14. 安徽省二计算机office试题及答案,计算机二级(MSOFFICE)模拟考试题及答案题目2
  15. Jeston Agx Xavier CPU GPU 高负载功耗测试
  16. 如何让邮件变的更安全?邮箱安全中心在哪里?
  17. Cause java.sql.SQLDataException Unsupported conversion from LONG to java.sql.Timestamp
  18. 计算机毕业设计基于Android宠物领养救助系统app
  19. 火车头采集图文教程-火车头采集各种数据规则教程
  20. matlab计算时间差多少秒,Matlab 设计时间计算器 计算时间差

热门文章

  1. Android 获取Wifi列表详解(包含动态权限申请)
  2. 【Java多线程】了解线程的锁池和等待池概念
  3. java宠物系统实战项目
  4. EnTaroTassadar【4】
  5. css修改多选框的样式
  6. js跳转到各手机应用商城
  7. Javascript项目— 甜心教主《爱你》版 贪吃蛇游戏
  8. 建设银行提示设备为root。
  9. (算法1) 从数组中快速寻找两数字之和为目标的数字 python
  10. java关键字查询数据库