springboot--事务的使用
@Transactional原理
事务是一些sql语句对数据库操作的集合,因此如果在一个Java方法里涉及了对数据库的操作,业务需要的话我们就可以考虑把这些操作作为一个事务。通过在方法上加个@Transactional(....)注解即可。
如:
public class Transaction { @Transactional(....)
public void doSomething() {
.....
}
}
对于springboot,加了@Transactional的方法其实是这样执行的:
BEGIN TRANSACTION;
try{
doSomething(); //执行方法
COMMIT;
}catch(Throwable t){
if(t是该回滚的异常)
ROLLBACK;
else
COMMIT;
}
知道了注解的原理就好办了,接下来只需了解这个注解的参数即可应付很多业务场景。
控制回滚参数
rollbackFor = xx.class 表示抛出的异常是xx类及其子类,事务会回滚; noRollbackFor = yy.class表示抛出异常是yy类或其子类,事务不会回滚。在@Transactional(rollbackFor = xx.class , noRollbackFor = yy.class)中,使用了控制回滚的参数。
catch到异常具体怎么办?根据以上几点规则,判断异常类型与参数中声明的类型关系决定。
事务组合控制参数
当一个作为事务的方法调用另一个作为事务的方法,它们之间的关系如何?这可以通过propagation参数控制。规则如下:
例如:
public class Transaction { @Autowired
TransactionB b; @Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
// 插入 id=1 的记录
b.methodB();
}
} class TransactionB { @Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
// 插入 id=2 的记录
}
}
1.methodB的注解参数 propagation = Propagation.REQUIRED 表示二者合并为同一个事务,id = 1,id = 2的记录只可能同时插入成功,或者同时插入失败。
2.若methodB的注解参数 propagation = Propagation.REQUIRES_NEW 表示methodB的事务会被作为一个新事务,两个事务之间没有约束关系,是独立的。 id = 1,id = 2的记录可能同时插入失败/成功,也可能成功插入某一条。
3.若methodB的注解参数 propagation = Propagation.NESTED,表示methodB的事务是嵌套在methodA的事务中的,嵌套事务成功需要依赖主事务成功。反过来嵌套 事务则不会决定主事务的成功。即id = 1插入成功(主),id = 2(嵌套)不一定插入成功;id = 1插入失败,id = 2则一定插入失败。
事务隔离级别控制参数
事务隔离级别的设置很简单,直接@Transactional(isolation = xx)就可以指定方法中事务的隔离级别,隔离级别从低到高有:READ_UNCOMMITTED(读未提交)、READ_COMMITTED(读已提交)、REPEATABLE_READ(可重复读)、SERIALIZABLE(串行化)。具体隔离级别以及每个隔离级别的意义这里就不讲了。
事务超时控制参数
timeout参数表示事务的时间限制,超出指定时间则抛出TransactionTimeOut异常。使用如下:
@Transactional(timeout = 5) //秒
public void methodA() { ---事务开始则计时开始
// 1 执行java代码 ---纳入计时
// 2 执行sql ---执行前检查是否超时
// 3 执行java代码 ---纳入计时
// 4 执行sql --执行前检查是否超时
// 5 执行java代码 ---由于sql执行完毕,事务已提交,这里不被纳入计时
}
注意:只有每次执行sql前会检查是否超时,如果执行这个sql前没超时,就算这个sql执行了20s也不会抛出TransactionTimeOut异常。
springboot--事务的使用的更多相关文章
- 【原创】003 | 搭上基于SpringBoot事务思想实战专车
前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往基于Spring Boot事务思想实战的专车,在上一篇 搭 ...
- 【原创】004 | 搭上SpringBoot事务诡异事件分析专车
前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 本专车系列文章 目前连载到第四篇,本专题是深入讲解Springboot源码,毕竟是 ...
- SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源
SpringBoot集成Mybatis 第一步我们需要在pom.xml里面引入mybatis相关的jar包 <dependency> <groupId>org.mybatis. ...
- java事务/springboot事务/redis事务
java事务(数据库事务):jdbc事务--ACID springboot事务:@Transactional--ACID redis事务:命令集合 将redis事务与mysql事务对比: Mysq ...
- springboot 事务创建流程源码分析
springboot 事务创建流程源码分析 目录 springboot 事务创建流程源码分析 1. 自动加载配置 2. InfrastructureAdvisorAutoProxyCreator类 3 ...
- springboot事务的传播行为和隔离级别
springboot事务的传播行为和隔离级别 在springboot中事务的传播行为和隔离级别都是在TransactionDefinition这个接口中定义的 传播行为定义了7种,分别用0-6来表示 ...
- springboot 事务执行全流程分析
springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...
- 第六章 springboot + 事务(转载)
本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350106.html 在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. myba ...
- 第六章 springboot + 事务
在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. mybatis与spring集成后,其事务该怎么做?其实很简单,直接在上一节代码的基础上在相应的方法(通常是servic ...
- SpringBoot事务注解@Transactional
SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作. 1. 事务说明 在Spring中,事务有两种实现方式,分别是编程式事务管理 ...
随机推荐
- Anaconda大法好,为什么要用Anaconda(附linux安装与用例)
距离写上一个博客已经过去很久了,注册的时候我还是个大三学生抱着windows系统的visual studio在OPENCV等等复杂组件下面瑟瑟发抖,一不小心就担心hpp找不到了,依赖库没了,或者安装了 ...
- spark 源码分析之二十二-- Task的内存管理
问题的提出 本篇文章将回答如下问题: 1. spark任务在执行的时候,其内存是如何管理的? 2. 堆内内存的寻址是如何设计的?是如何避免由于JVM的GC的存在引起的内存地址变化的?其内部的内存缓存 ...
- DesignPattern系列__01SingletonResponsibility
单一职责原则 单一职责原则:一个类应该只有一个原因引起改变,即一个类应该只负责一个业务逻辑. 问题由来:类T负责t1, t2两个职责,当因为t1j对类T修改的时候,可能导致类T出现问题而影响职责t2. ...
- hdoj 4715 Difference Between Primes 素数筛选+二分查找
#include <string.h> #include <stdio.h> const int maxn = 1000006; bool vis[1000006]; int ...
- host配置
host添加地址 今天是我第一天入职,坐到工位的第一件事就是配置host,因为连接测试环境需要本地授权,所以要配置.这里简单记录下配置中遇到的问题和操作的步骤 操作环境是win10,之前公司一直使用的 ...
- 如何在Vue项目中使用vw实现移动端适配
有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在< 使用Flexible实现手淘H5页面的终端适配>提出了Flexible的布局方案,随着 viewport 单位 ...
- jQuery中的append中含有onClick的问题
在jQuery中,当append中含有onClick时,点击事件无效果.需要在append完之后再额外绑定点击事件.
- pikachu
题目链接:http://127.0.0.1/pikachu-master/vul/sqli/sqli_id.php 题目来源:pikachu-->SQL-inject-->数字型注入(po ...
- 峰回路转:去掉 DbContextPool 后 Windows 上的 .NET Core 版博客表现出色
今天早上,我们修改了博客程序中的1行代码,将 services.AddDbContextPool 改为 services.AddDbContext ,去掉 DbContextPool . 然后奇迹出现 ...
- Codeforces 343D Water Tree
题意简述 维护一棵树,支持以下操作: 0 v:将以v为跟的子树赋值为1 1 v:将v到根节点的路径赋值为0 2 v:询问v的值 题解思路 树剖+珂朵莉树 代码 #include <set> ...