什么是全局事务 Spring Boot(Spring)事务是通过aop(aop相关术语:通知(Advice)、连接点(Joinpoint)、切入点(Pointcut)、切面(Aspect)、目标(Target)、代理(Proxy)、织入(Weaving))切面编程来实现的,此时我们就可以对指定的包的service的方法进行事务控制.

为什么要使用全局事务 在实际开发中,有些同学命名方法时不规范,多个成员开发时,会造成混乱,维护成本特别高,代码可读性不高.

怎么配置Spring Boot全局事务 Spring Boot使用事务是非常简单的,只需要在配置类或者启动类上添加注解@EnableTransactionManagement开启事务支持,然后在service层添加注解 @Transactional(rollbackFor = Exception.class)即可. 下面是全局事务代码实现

 特别提醒:mysql对应的表必须是InnoDB型才可支持事务,myisam不支持事务
package com.test.sketelon.util.config;

import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.interceptor.*;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
* 全局事物配置
*
* @author David_hua
* @date 2019/8/15
* REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
* SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
* MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
* REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。
* NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。
* NEVER :以非事务方式运行,如果当前存在事务,则抛出异常。
* NESTED :如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED 。
* 指定方法:通过使用 propagation 属性设置,例如:@Transactional(propagation = Propagation.REQUIRED)
* 参考文章;https://blog.csdn.net/schcilin/article/details/93306826
*/
@Aspect
@Configuration
public class TransactionAdviceConfig {

/**
* 配置方法过期时间,默认-1,永不超时
*/
private final static int TX_METHOD_TIME_OUT = 10;

/**
* 全局事务位置配置 在哪些地方需要进行事务处理:具体如下
* 配置切入点表达式,这里解释一下表达式的含义
* 1.execution(): 表达式主体
* 2.第一个*号:表示返回类型,*号表示所有的类型
* 3.com.schcilin.goods.service表示切入点的包名
* 4.第二个*号:表示实现包
* 5.*(..)*号表示所有方法名,..表示所有类型的参数
*/
private static final String POITCUT_EXPRESSION = "execution(* com.test.sketelon.service.*.*(..))";
@Autowired
private PlatformTransactionManager platformTransactionManager;

@Bean
public TransactionInterceptor txadvice() {
/** 配置事务管理规则
nameMap声明具备需要管理事务的方法名.
这里使用public void addTransactionalMethod(String methodName, TransactionAttribute attr)
*/
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
Map<String, TransactionAttribute> nameMap = new HashMap<>(16);
/*只读事物、不做更新删除等*/
/*事务管理规则*/
RuleBasedTransactionAttribute readOnlyRule = new RuleBasedTransactionAttribute();
/*设置当前事务是否为只读事务,true为只读*/
readOnlyRule.setReadOnly(true);
/* transactiondefinition 定义事务的隔离级别;
* PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中*/
readOnlyRule.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
RuleBasedTransactionAttribute requireRule = new RuleBasedTransactionAttribute();
/*抛出异常后执行切点回滚*/
requireRule.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
/*PROPAGATION_REQUIRED:事务隔离性为1,若当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。 */
requireRule.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
/*设置事务失效时间,超过10秒,可根据hytrix,则回滚事务*/
requireRule.setTimeout(TX_METHOD_TIME_OUT);

nameMap.put("add*", requireRule);
nameMap.put("save*", requireRule);
nameMap.put("insert*", requireRule);
nameMap.put("update*", requireRule);
nameMap.put("delete*", requireRule);
nameMap.put("remove*", requireRule);
/*进行批量操作时*/
nameMap.put("batch*", requireRule);
nameMap.put("get*", readOnlyRule);
nameMap.put("query*", readOnlyRule);
nameMap.put("find*", readOnlyRule);
nameMap.put("select*", readOnlyRule);
nameMap.put("count*", readOnlyRule);
source.setNameMap(nameMap);
return new TransactionInterceptor(platformTransactionManager, source);
}

/**
* 设置切面=切点pointcut+通知TxAdvice
*
* @return
*/
@Bean
public Advisor txAdviceAdvisor() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(POITCUT_EXPRESSION);
return new DefaultPointcutAdvisor(pointcut, txadvice());
}
}

  

总结 以上是整个Spring Boot事务的解释及其使用.spring是以aop切面编程思想管理整个事务的创建,提交和回滚的.支持编程式事务和声明式事务.在实际项目中,声明式事务使用的相对比较简单一些,但是在处理更小粒度的操作时,就需要编程式事务啦.更有是在实际中,有可能使用多个事务管理器(jdbc和jta)两种.此时就需要指定事务管理器

Springboot全局事务处理的更多相关文章

  1. springboot 全局异常处理

    springboot 全局异常处理 研究了半天springboot的全局异常处理,虽然还是需要再多整理一下,但是对于常见的404和500足以可以区分开,能够根据这两个异常分别处理 首先配置视图解析路径 ...

  2. SpringBoot全局异常拦截

    SpringBoot全局异常捕获 使用到的技能 @RestControllerAdvice或(@ControllerAdvice+@ResponseBody) @ExceptionHandler 代码 ...

  3. SpringBoot全局时间转换器

    SpringBoot全局时间转换器 日常开发中,接收时间类型参数处处可见,但是针对不同的接口.往往需要的时间类型不一致 @DateTimeFormat(pattern = "yyyy-MM- ...

  4. SpringBoot基础学习(二) SpringBoot全局配置文件及配置文件属性值注入

    全局配置文件 全局配置文件能够对一些默认配置值进行修改.SpringBoot 使用一个名为 application.properties 或者 application.yaml的文件作为全局配置文件, ...

  5. springboot全局捕获异常

    捕获 捕获原理,使用AOP技术,采用异常通知. 1.捕获返回json格式 2.捕获返回页面 步骤: 1.@ControllerAdvice(pasePackage="") 注释异常 ...

  6. SpringBoot全局配置文件

    SpringBoot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到r ...

  7. (转)springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)

    1.@ControllerAdvice 1.场景一 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": ...

  8. 十四、springboot全局处理异常(@ControllerAdvice + @ExceptionHandler)

    1.@ControllerAdvice 1.场景一 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": ...

  9. 【第二十三章】 springboot + 全局异常处理

    一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation ...

随机推荐

  1. 使用gravatar生成头像

    avatar代表您在线的图像,当你与网站互动时,你的名字旁边会出现一张图片. Gravatar是一个全球通用的头像.你只需上传一次并创建自己的个人资料,然后当你加入任何支持Gravatar的网站时,你 ...

  2. struct结构体 重载运算符

    struct node{ int x,y,z; }; bool operator<(node a,node b) { if(a.x!=b.x) return a.x<b.x; if(a.y ...

  3. C++ 排序引用的优化

    链接:https://www.nowcoder.com/acm/contest/83/B来源:牛客网 题目描述 第一次期中考终于结束啦!沃老师是个语文老师,他在评学生的作文成绩时,给每位学生的分数都是 ...

  4. 如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出

    这是该系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输 ...

  5. IDEA使用 磨刀霍霍向代码

    工欲善其事,必先利其器 ,当下有数不清的 Java 程序员将石器时代的 Eclipse 替换成了现代化的智能开发工具 InteliJ IDEA ,写代码的小日子过得不亦乐乎(玩笑话,两者各有千秋,看个 ...

  6. 02.flask-script

    网址:https://pypi.org/project/Flask-Script/ 文档:https://flask-script.readthedocs.io/en/latest/ 1.安装 2.新 ...

  7. scrapy selector选择器

    这部分内容属于补充内容 1.xpath() 2.css() 3.正则表达式 # 多个值,列表 response.xpath('//a/text()').re('(.*?):\s(.*)') # 取第一 ...

  8. 利用Springmvc的AbstractXlsxView下载Excel文件

    设计一个模型,在针对多中数据类型进行拓展 public abstract class ExcelView extends AbstractXlsxView { public CellStyle cel ...

  9. Nmap使用教程(一)

    基本扫描技术 扫描单个网络 nmap 192.168.1.1/www.baidu.com 扫描多个网络/目标 nmap 192.168.1.1 192.168.1.2 #将扫描同个网段内不同的ip地址 ...

  10. maven-assembly-plugin入门

    愿文地址:https://www.jianshu.com/p/e8585a991e8e 当你使用 Maven 对项目打包时,你需要了解以下 3 个打包 plugin,它们分别是 plugin func ...