当前位置:首页 > Java技术 > SpringBoot 注解事务声明式事务的方式

SpringBoot 注解事务声明式事务的方式

2022年09月16日 11:17:31Java技术6

springboot的事务也主要分为两大类,一是xml声明式事务,二是注解事务,注解事务也可以实现类似声明式事务的方法

springboot xml声明式事务

可以使用 @ImportResource(“classpath:transaction.xml”) 引入该xml的配置,xml的配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd">
  <bean id="txManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" ></property>
  </bean>
  <tx:advice id="cftxAdvice" transaction-manager="txManager">
    <tx:attributes>
      <tx:method name="query*" propagation="SUPPORTS" read-only="true" ></tx:method>
      <tx:method name="get*" propagation="SUPPORTS" read-only="true" ></tx:method>
      <tx:method name="select*" propagation="SUPPORTS" read-only="true" ></tx:method>
      <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" ></tx:method>
    </tx:attributes>
  </tx:advice>
   <aop:config>
    <aop:pointcut id="allManagerMethod" expression="execution (* com.exmaple.fm..service.*.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" order="0" />
  </aop:config>
</beans>

springboot 启动类如下:

package com.example.fm;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@ImportResource("classpath:transaction.xml")
@SpringBootApplication
public class Application {
     
  public static void main(String[] args) {
     
    SpringApplication.run(Application.class, args);
  }
}

springboot 注解事务

package cn.**.app.common.config;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
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.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.RollbackRuleAttribute;
import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute;
import org.springframework.transaction.interceptor.TransactionAttribute;
import org.springframework.transaction.interceptor.TransactionInterceptor;

@Aspect
@Configuration
public class TransactionConfiguration {
     
	
	private static final int TX_METHOD_TIMEOUT = 5;
	private static final String AOP_POINTCUT_EXPRESSION = "execution (* cn.*..*.service.impl.*.*(..))";
	
	
	@Autowired
	private PlatformTransactionManager transactionManager;
	
	@Bean
	public TransactionInterceptor txAdvice() {
     
		NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
		/* 只读事务,不做更新操作 */
		RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
		readOnlyTx.setReadOnly(true);
		readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
		/* 当前存在事务就使用当前事务,当前不存在事务就创建一个新的事务 */
		RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute();
		requiredTx.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
		requiredTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		requiredTx.setTimeout(TX_METHOD_TIMEOUT);
		Map<String, TransactionAttribute> txMap = new HashMap<>();
		txMap.put("add*", requiredTx);
		txMap.put("save*", requiredTx);
		txMap.put("insert*", requiredTx);
		txMap.put("update*", requiredTx);
		txMap.put("delete*", requiredTx);
		txMap.put("get*", readOnlyTx);
		txMap.put("query*", readOnlyTx);
		txMap.put("*", requiredTx);
		source.setNameMap(txMap);
		TransactionInterceptor txAdvice = new TransactionInterceptor(transactionManager, source);
		return txAdvice;
	}
	
	@Bean
	public Advisor txAdviceAdvisor() {
     
		AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
		pointcut.setExpression(AOP_POINTCUT_EXPRESSION);
		return new DefaultPointcutAdvisor(pointcut, txAdvice());
	}
}

作者:FMSCOTT
来源链接:https://blog.csdn.net/fmscott/article/details/102851435

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/41738.html

分享给朋友:

“SpringBoot 注解事务声明式事务的方式” 的相关文章

SpringBoot事务简单操作及手动回滚

本节部分内容摘自:https://blog.csdn.net/zzhongcy/article/details/102893309 一、引入依赖 <!-- 核心启动器, 包括auto-configuration、logging and YAML -->...

spring boot配置事务(事务回滚)

spring boot配置事务(事务回滚)

在业务层(service)中难免存在要先后操作多张表的业务逻辑,如前端完成一个操作,后台需要对数据库三张表进行操作,如若任意一个操作事务,这几个操作都应该不允许被实现,即回到操作前,解决方法是开启事务,让其在出错时实现事务回滚作用。 如:有以下三个...

SpringBoot2.x学习-事务管理

一、事务介绍 1、数据库事务:是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。这些操作要么全部执行成功提交(commit),要么全部中止失败(abort,rollback)。就是在数据库执行多条SQL语句,要么都执行成功,...

【SpringBoot】SpringBoot常用注解

                                       ...

SpringBoot中添加事务

今天项目中需要使用到事务,所以在这里将SpringBoot的事务实现方式学习一下 SpringBoot中使用事务会使用到@Transactional这个注解来实现   先来对Transactional注解有个大致了解   1.其上注解...

SpringBoot配置AOP与事务控制

SpringBoot配置AOP与事务控制

SpringBoot配置AOP与事务控制 前言 AOP:面向切面编程,可以在不影响源代码的情况下对方法进行动态增强 事务:日常开发中经常碰到的一个问题,假如程序出现了异常,可能会导致提交到数据库不一致的情况发生。所以需要事务来解决,事务...

springboot 默认事务 代码示例

springboot 默认事务 代码示例

springboot 默认事务 代码示例 Ⅰ同一个类内默认传播行为的调用 1.1 方法addTeacher带默认传播行为的事务调用没事务的方法updateTeacher @Transactional(propagation = Pro...

SpringBoot多数据源配置事务

在多数据源中配置事务,其实对于SpringBoot来很简单,当然这个的前提是首先把多数据源都配好的情况下,如果不会多数据源配置,请看该系列 SpringBoot整合多数据源 首先在启动类配置 @SpringBootApplication @E...

Springboot事务配置

在一个config类名上面加入注解,用来开启事务 @EnableTransactionManagement 再加入一个BEAN类来配置事务 @Bean public DataSourceTransactionManager transactionMa...

浅谈SpringBoot事务处理

浅谈SpringBoot事务处理

什么是事务 所有数据访问技术都有事务机制,这些技术提供了API来开启事务、提交事务完成数据操作,或者在发生错误的时候回滚数据。 Spring采用统一的机制来处理不同的数据访问技术的事务,Spring的事务提供一个 PlatformTransactionManager...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。