Spring事务隔离级别与设置
我们都知道数据库隔离级别有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事务隔离级别与设置相关推荐
- 事务,Oracle,MySQL及Spring事务隔离级别
一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割: 一致性 (consi ...
- Spring事务隔离级别与数据库隔离级别不一致时,该以谁为准?
原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重. 前言 通过本篇,你将了解到[Spring事务]与[数据库事务]的关系,以及优先级问题,我将为你一一论证. 阅读本篇,你可能会需要的博文: ...
- spring事务隔离级别、传播行为以及spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战
一.事务传播性 1.1 什么是事务的传播性 事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务 ...
- spring 事务隔离级别和传播行为_Java工程师面试1000题146-Spring数据库事务传播属性和隔离级别...
146.简介一下Spring支持的数据库事务传播属性和隔离级别 介绍Spring所支持的事务和传播属性之前,我们先了解一下SpringBean的作用域,与此题无关,仅做一下简单记录. 在Spring中 ...
- spring事务隔离级别与数据库事务隔离级别的关系
一直没搞清楚spring事务与数据库事务与锁之间的关系. spring事务: spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spri ...
- mysql 事务补偿_TCC补偿性策略_彻底学习数据库事务 seata分布式事务 共享 排它锁 死锁 索引 Spring事务 隔离级别等_MySQL视频-51CTO学院...
课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程.对于难以理解的知识点,全部用画图+实战的方式讲解. 彻底明白事务的四个特性:原子性.一致性.隔离性.持久性,用 ...
- mysql事务隔离级别与设置
mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...
- Spring事务隔离级别,事务传播行为
什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. Spring事务的隔离性(5种) 在讲隔离界别前,我们先来讲讲下基础知识 事务的特性(ACID) 原子性 ...
最新文章
- java中gc的认识,java JVM GC 笔记(个人对GC 或JVM 的了解)
- Form表单基础知识和常用兼容方法笔记(二)
- linux 文件列添加字段,如何在linux中加入所需列的文件?
- 实例解析网络编程中的另类内存泄漏
- Java开发新手经常遇到的一些问题
- 机器学习分类算法_Python机器学习之K近邻分类算法(四)
- 中文核心期刊目录(2008年最新版)
- Java实习日记(day1)
- GBASE 8s UDR内存管理_05_mi_free
- 抱歉,当前存在网络问题或服务器繁忙错误代码:20003问题解决方法
- 流体动力润滑(轴承油膜承载机理)
- 基于微信小程序的宠物医院诊所小程序源码
- matlab温度等值线图函数,matlab等值线图
- 安徽省二计算机office试题及答案,计算机二级(MSOFFICE)模拟考试题及答案题目2
- Jeston Agx Xavier CPU GPU 高负载功耗测试
- 如何让邮件变的更安全?邮箱安全中心在哪里?
- Cause java.sql.SQLDataException Unsupported conversion from LONG to java.sql.Timestamp
- 计算机毕业设计基于Android宠物领养救助系统app
- 火车头采集图文教程-火车头采集各种数据规则教程
- matlab计算时间差多少秒,Matlab 设计时间计算器 计算时间差