SpringBoot 开启事务的常用方式

news/2024/12/29 1:48:20/

前言,有时候统一异常处理不太好,因为范围太广了,很多没必要回滚的地方,因为抛了个异常都没办法继续执行别的代码,所以,可以在需要开事务的地方添加 @Transation 注解开启事务就行了。

springboot 项目中,一般两种方式可以开启事务:
1. 只需要在类或者方法上添加注解 @Transaction 即可开启事务;
一般在service类标签上添加@Transactional,这样可以将整个service类纳入spring事务管理(所有的 public 方法纳入),在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式。
在方法上添加这个注解也可以将方法纳入事务(注意事项:@Transactional必须添加在public修饰的方法上)。
2. 在配置类中使用注解 @EnableTransactionManagement 然后指定开启事务的地方,这样即使不添加注解 @Transactional 也可以在指定地方开启事务。
如果采用 @EnableTransactionManagement 开启统一的事务控制器,可用代码如下:
 

@Configuration
@EnableTransactionManagement
public class TransactionConfig {/*** 配置全局事务的切点为service层的所有方法  AOP切面表达式 可参考(https://blog.csdn.net/ycf921244819/article/details/106599489)* TODO 设置service层所在位置*/private static final String AOP_POINTCUT_EXPRESSION = "execution (* com.xxx.service..*.*(..))";private static final String[] REQUIRED_RULE_TRANSACTION = {"insert*", "create*", "add*", "save*","modify*", "update*", "del*", "delete*"};private static final String[] READ_RULE_TRANSACTION = {"select*", "get*", "query*", "search*", "count*","detail*", "find*"};/*** 注入事务管理器*/@Autowiredprivate TransactionManager transactionManager;/*** 配置事务拦截器*/@Beanpublic TransactionInterceptor txAdvice() {RuleBasedTransactionAttribute txAttrRequired = new RuleBasedTransactionAttribute();txAttrRequired.setName("REQUIRED事务");//设置事务传播机制,默认是PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务txAttrRequired.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);//设置异常回滚为Exception  默认是RuntimeExceptionList rollbackRuleAttributes = new ArrayList<>();rollbackRuleAttributes.add(new RollbackRuleAttribute(Exception.class));txAttrRequired.setRollbackRules(rollbackRuleAttributes);RuleBasedTransactionAttribute txAttrRequiredReadOnly = new RuleBasedTransactionAttribute();txAttrRequiredReadOnly.setName("SUPPORTS事务");//设置事务传播机制,PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行txAttrRequiredReadOnly.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);//设置异常回滚为Exception  默认是RuntimeExceptiontxAttrRequiredReadOnly.setRollbackRules(rollbackRuleAttributes);txAttrRequiredReadOnly.setReadOnly(true);/*事务管理规则,声明具备事务管理的方法名*/NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();//方法名规则限制,必须以下列开头才会加入事务管理当中for (String s : REQUIRED_RULE_TRANSACTION) {source.addTransactionalMethod(s, txAttrRequired);}//对于查询方法,根据实际情况添加事务管理 可能存在查询多个数据时,已查询出来的数据刚好被改变的情况for (String s : READ_RULE_TRANSACTION) {source.addTransactionalMethod(s, txAttrRequired);}return new TransactionInterceptor((PlatformTransactionManager) transactionManager, source);}/***  设置切面*/@Beanpublic Advisor txAdviceAdvisor() {AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();pointcut.setExpression(AOP_POINTCUT_EXPRESSION);return new DefaultPointcutAdvisor(pointcut, txAdvice());}
}

写在最后:
其实两种方式都不需要写 @EnableTransactionManagement 就能使用事务;
为什么SpringBoot中不需要使用@EnableTransactionManagement就能使用事务?
答:因为在SpringBoot中自动装配了此注解配置,所以已被默认启用,自然不需要手动加上此注解。
 


http://www.ppmy.cn/news/851694.html

相关文章

iPhone 13发布会,苹果不想让你知道的三个细节

文|智能相对论&#xff08;ID&#xff1a;aixdlun&#xff09; 作者|宋文远 9月15日凌晨&#xff0c;随着库克标志性“Good morning&#xff01;”开场白&#xff0c;苹果今年最重要的秋季发布会如期而至。 简单总结一下&#xff0c;此次发布会苹果共发布了四款新产品&#x…

苹果修复3个已遭利用的新 0day

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;代码卫士 苹果修复了用于攻击 iPhone、Mac 和 iPad 的三个新0day。 苹果公司在安全公告中指出&#xff0c;“苹果已注意到该漏洞可能遭活跃利用的报告。”这三个漏洞均位于多平台的 WebKit 浏览器引…

华强北3代耳机介绍,华强北耳机可靠吗?值得买吗?哪里买?

大家好&#xff0c;很高兴认识大家&#xff0c;今天和大家来聊聊这几个话题&#xff0c;华强北AirPods耳机可靠吗&#xff1f;值得买吗&#xff1f;哪里买。 目录 华强北AirPods耳机简单科普。华强北耳机的缺点知多少&#xff1f;华强北耳机三代主流版本建议选择&#xff1f;…

WEB APIs day3 (1)

一、表单全选反选案例 <!DOCTYPE html><html><head lang"en"><meta charset"UTF-8"><title>全选反选案例</title><style>* {margin: 0;padding: 0;}table {border-collapse: collapse;border-spacing: 0;border…

数学建模——TOPSIS法

TOPSIS法&#xff08;Technique for Order Preference by Similarity to ldeal Solution&#xff09; 可翻译为逼近理想解排序法&#xff0c;国内常简称为优劣解距离法 TOPSIS法是一种常用的综合评价方法&#xff0c;其能充分利用原始数据的信息&#xff0c;其结果能精确的反应…

各大浏览器的内核分别是什么?

各大浏览器的内核分别是什么? IE: trident内核Firefox&#xff1a;gecko内核Safari: webkit内核Opera: 以前是presto内核&#xff0c;Opera现已改用Google - Chrome的Blink内核Chrome: Blink(基于webkit&#xff0c;Google与Opera Software共同开发)

浏览器的内核分别是什么?

浏览器的内核分别是什么? IE: trident内核 Firefox&#xff1a;gecko内核 Safari&#xff1a;webkit内核 Opera&#xff1a;以前是presto内核&#xff0c;Opera现已改用Google Chrome的Blink内核 Chrome&#xff1a;Blink(基于webkit&#xff0c;Google与Opera Software共同开…

IE内核开发

开发一个浏览器&#xff0c;或者浏览器插件&#xff0c;或者浏览器上的工具条&#xff0c;并不是很难的事情&#xff0c;因为微软已经考虑到了这一些需求&#xff0c;因此给我们提供了一些接口和方法来实现这些想法&#xff0c;只是这些接口比较难懂。 开发浏览器插件&#xff…