基于TransactionProxyFactoryBean的方式首先在applicationContext.xml文件中添加事务管理器相关配置和TransactionProxyFactoryBean代理对象(前七步的代码这里不再重复贴出 , 这里这贴出与本方式相关的代码):
<!--基于TransactionProxyFactoryBean的方式--><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--配置业务层的代理--><bean id="transferServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><!--配置目标对象--><property name="target" ref="transferService" /><!--注入事务管理器--><property name="transactionManager" ref="transactionManager" /><!--注入事务属性--><property name="transactionAttributes"><props><!--prop的格式:* PROPAGATION :事务的传播行为* ISOLATION :事务的隔离级别* readOnly :是否只读* -Exception :发生哪些异常回滚事务* +Exception :发生哪些异常不回滚事务--><prop key="transfer*">PROPAGATION_REQUIRED</prop></props></property></bean>
接着新建一个测试类SpringTransactionApplicationTest:
import com.envy.service.TransferService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.annotation.Resource;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringTransactionApplicationTest {@Autowiredprivate TransferService transferService;@Resource(name="transferServiceProxy")private TransferService transferServiceProxy;@Testpublic void TestOne(){//注意 , 此处使用的是代理对象transferServiceProxy , 而不是transferServicetransferServiceProxy.transferMoney("小明","小白",66L);}}
运行结果为:
java.lang.ArithmeticException: / by zero
可以看到执行service事务方法时抛出异常 , 事务回滚 , 数据库中数据未发生改变:(如果将transferMoney方法中的int i = 100/0;代码注释掉 , 则转账会成功 。)
文章插图
基于AspectJ的XML方式首先在applicationContext.xml文件中添加事务管理器的配置、事务的增强以及切面:
<!--基于AspectJ的XML方式--><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--配置事务的通知--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="transfer" propagation="REQUIRED"/></tx:attributes></tx:advice><!--配置切面--><aop:config><!--配置切入点--><aop:pointcut id="pointcut1" expression="execution(* com.envy.service.Impl.*ServiceImpl.*(..))"/><!--配置AOP的切面--><aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/></aop:config>
接着新建一个测试类SpringTransactionApplicationTestTwo:import com.envy.service.TransferService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.annotation.Resource;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringTransactionApplicationTestTwo {@Autowiredprivate TransferService transferService;@Testpublic void TestTwo(){transferService.transferMoney("小明","小白",88L);}}
运行结果为:
推荐阅读
- 心理委员的职责是什么?
- Spring容器6种注入方式
- 通过深度系统学习Linux用户和组
- 如何正确控制springboot中bean的加载顺序总结
- Spring Boot 2.x基础教程:EhCache缓存的使用
- 黑客全家桶、文字提取利器、深度学习 500 问 | GitHub 热点速览
- 基于机器学习的自适应码率算法的进一步探索与改进
- 军事智能化之机器学习《清明上河图》里几个人几个牲口一览无余
- SpringBoot下使用定时任务的方式全揭秘
- 学习美甲以及美甲注意事项