项目开发中事务管理是非常重要的一个环节,在一些信息管理系统中,不需要对事务管理进行大规模精细化控制,因此配置主动的事务管理机制是降低代码Bug的重要手段。本文主要讲述在Springboot下如何配置主动事务管理,让开发者能够聚焦在自己的业务代码实现上。
编写配置资源
在项目的src/main/resources/config下,配置transaction-management.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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--
The following settings are default settings that apply to the entire application, and define the following two for all transactional methods calls.
・Use REQUIRED as a transaction propagation method
・Roll back a transaction when an exception occurs
If you can not follow this default setting, you can overwrite the settings of individual transactions by giving @Transactional.
-->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="load*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
<tx:method name="search*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
<tx:method name="get*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true" rollback-for="java.lang.Exception"/>
<tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
</tx:attributes>
</tx:advice>
<!-- Apply txAdvice to all public methods that are granted @Service but not @Transactional with class / method -->
<aop:config>
<aop:pointcut id="serviceOperation"
expression="execution(* *(..))
and @within(org.springframework.stereotype.Service)
and !@annotation(org.springframework.transaction.annotation.Transactional)
and !@within(org.springframework.transaction.annotation.Transactional)
and !@annotation(javax.transaction.Transactional)
and !@within(javax.transaction.Transactional)"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>
</beans>
此配置,将对项目中使用@Service注解添加事务控制,但是排除了使用或继承@javax.transaction.Transactional和@org.springframework.transaction.annotation.Transactional的类。
此外,对以load,search,get,find开头的命名方法使用readonly事务。
创建配置类
将上面创建的配置资源使用Springboot的@ImportResource方法加载。
@Configuration
@ImportResource({ "classpath:/config/transaction-management.xml" })
public class TxtManagentConfiguration {
}
版权声明:本文为bitemet原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。