Springboot全局事务处理

本文完全转载:原文为做一只快乐的猴子!的文章:Springboot全局事务处理
只是作为备忘和学习,如有侵权,会删除,谢谢

什么是全局事务 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.*.*(..))";@Autowiredprivate PlatformTransactionManager platformTransactionManager;
​@Beanpublic 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*/@Beanpublic Advisor txAdviceAdvisor() {AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();pointcut.setExpression(POITCUT_EXPRESSION);return new DefaultPointcutAdvisor(pointcut, txadvice());}
}
~~~ 

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

转载:Springboot全局事务处理相关推荐

  1. springBoot 全局异常方式处理自定义异常 @RestControllerAdvice + @ExceptionHandler

    springBoot 全局异常方式处理自定义异常 @RestControllerAdvice + @ExceptionHandler 参考文章: (1)springBoot 全局异常方式处理自定义异常 ...

  2. java date 格式化_3种 Springboot 全局时间格式化方式,别再写重复代码了

    原文:3种 Springboot 全局时间格式化方式,别再写重复代码了 掘金 作者: 程序员内点事 时间格式化在项目中使用频率是非常高的,当我们的API接口返回结果,需要对其中某一个date字段属性进 ...

  3. springboot全局异常处理_SpringBoot:如何优雅地处理全局异常

    之前用springboot的时候,只知道捕获异常使用try{}catch,一个接口一个try{}catch,这也是大多数开发人员异常处理的常用方式,虽然屡试不爽,但会造成一个问题,就是一个Contro ...

  4. springboot 全局异常处理类

    目录标题 springboot 全局异常处理类 依赖 代码 springboot 全局异常处理类 依赖 <!-- Spring Boot Web 依赖 核心 --><dependen ...

  5. SpringBoot全局异常处理及前端请求参数校验

    SpringBoot全局异常捕获处理及参数校验 文章目录 SpringBoot全局异常捕获处理及参数校验 为什么要用全局异常处理? 如何进行全局异常捕获和处理? 统一结果封装 统一返回结果 枚举类 使 ...

  6. SpringBoot SpringBoot 基础篇(第一篇) 第2章 SpringBoot 全局配置 2.2 yaml 文件

    SpringBoot [千锋教育java教程SpringBoot2全套,springboot快速入门到项目实战视频教程] SpringBoot 基础篇(第一篇) 第2章 SpringBoot 全局配置 ...

  7. (转载)全局分布式事务GTS原理以及架构(二)

    GTS核心流程 GTS采用的是基于XA架构优化的技术路线,GTS方案认为XA性能低效主要原因是分布式任务提交设计阻塞(2PC),分布式事务提交的第一阶段等待最慢的一个分支事务完成之后才能完成所有的事务 ...

  8. [SpringBoot]全局异常处理

    2019独角兽企业重金招聘Python工程师标准>>> 1. 全局异常处理 2. SpringBoot错误处理原理 3. SpringBoot定制错误页面 4. SpringBoot ...

  9. 如何优雅的处理异常?SpringBoot全局异常与数据校验

    要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后 ...

最新文章

  1. tp5.0 新增模块
  2. 任务调度算法题Java_一个任务调度问题-----算法导论
  3. 嵌入式程序员应知道的基本问题-C语言(zz)
  4. python程序员面试宝典 勘误_《前端面试江湖》勘误合集(二)
  5. Asp.Net Core 轻松学-多线程之Task快速上手
  6. 我在大学毕业后学习Linux、python的一些经验
  7. 2018年10月28日宁波dotnet社区活动回顾及下次活动预告
  8. 数据结构(二)之链表反转
  9. 高等数学一使用python实现极限后有代码
  10. java三大特征_java三大特性是什么?
  11. getBytes方法
  12. 儿研所 计算机训练,金博智慧:注意缺陷、多动障碍儿童计算机认知训练(工作记忆训练)研究...
  13. HDU——2154——跳舞毯
  14. es - elasticsearch - search - DSL - specialized - pinned
  15. logo设计灵感的创意网站
  16. iOS底层原理之架构设计
  17. 高博视觉SLAM十四讲--罗德里格斯公式推导
  18. 关于win10图标不正常显示的一种解决方法
  19. 外网访问redis cluster的大坑
  20. CP2102 USB to UART Bridge Driver的安装

热门文章

  1. 防抖节流的实现与区分(详解带代码)
  2. 小家伙的第一次露营体验
  3. Mean Squared Error 和 Maximum-A-Posterior (Maximum Likelihood Estimation) 的关系
  4. 计算机语言mid是什么意思,MID是什么
  5. Android安全加密
  6. 我的Photoshop大师之路(三)
  7. SLAM综述科普性文章
  8. ddr2是几代内存_DDR1 DDR2 DDR3内存条有什么区别?怎么区分?
  9. arm开发板嵌入式Linux的ftp软件
  10. 谷歌PR权重劫持的原理与方法介绍