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());
}
}