spring的声明式事务让程序员不在业务层用硬编码的方式进行事务控制,大大简化了编码难度,代码调整方便。spring的声明式事务基于AOP实现,在配置文件中即可完成,需要使用tx、aop、两个命名空间下的标签完成。
配置事务管理器
需要配置一个事务管理器,通过它来完成对事务处理的全面支持和统一管理,
在切面中相当于增强处理类,这里使用DataSourceTransactionManager来实现。
<!-- 省略数据源、SqlSessionFactoryBean、DAO 及业务Bean的配置-->
<!-- 定义事务管理器,注入配置好的数据源-->
<bean id="txManager" class="org.springframework.jdbc.dataSource" ref="dataSource"></bean>
使用<tx:advice>标签配置事务增强
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- 定义属性,声明事务规则 -->
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="add*" propogation="REQUIRED"/>
<tx:method name="del*" propogation="REQUIRED"/>
<tx:method name="update*" propogation="REQUIRED"/>
<tx:method name="*" propogation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<tx:advice>标签可以设置transaction-manager属性引用一个事务管理器Bean。
transaction-manager属性的默认值是transactionManager。
如果事务管理Bean的id是这个的话可以不指定该属性。
<tx:attributes>子标签定义事务属性,事务属性通过<tx:method>标签进行设置,可以为不同的方法设置不同的事务属性。其中name属性用于指定匹配的方法,可以使用通配符(*)。
定义切面
<!-- 定义切面 -->
<aop:config>
<!-- 定义切入点 -->
<aop:point id="serviceMethod" expression="execution(*cn.smbms.service..*(..))"/>
<!-- 将事务增强与切入点组合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
至此声明式事务已经配置在了service层的所有类的所有方法上。
在这里保存一篇很详细、很有参考价值的文章:https://blog.csdn.net/zht741322694/article/details/78676964