java.lang.ArithmeticException: / by zero
可以看到执行service事务方法时抛出异常 , 事务回滚 , 数据库中数据未发生改变:
文章插图
如果将transferMoney方法中的int i = 100/0;代码注释掉 , 则转账会成功:
文章插图
基于注解的方式首先在applicationContext.xml文件中添加事务管理器的配置和开启事务注解:
<!--基于注解的方式--><!--配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--开启事务注解--><tx:annotation-driven transaction-manager="transactionManager"/>
接着在TransferServiceImpl类中的事务方法transferMoney中添加@Transactional注解:@Transactionalpublic void transferMoney(String source, String destination, Long amount) {//付款操作transferDao.payMoney(source,amount);//int i = 100/0;//此处用于测试抛异常时是否会回滚//收款操作transferDao.collectMoney(destination,amount);}
最后新建一个测试类SpringTransactionApplicationTestThree: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 SpringTransactionApplicationTestThree {@Autowiredprivate TransferService transferService;@Testpublic void TestThree(){transferService.transferMoney("小明","小白",99L);}}
运行结果为:java.lang.ArithmeticException: / by zero
可以看到执行service事务方法时抛出异常 , 事务回滚 , 数据库中数据未发生改变:文章插图
如果将transferMoney方法中的int i = 100/0;代码注释掉 , 则转账会成功:
文章插图
编程式事务管理和声明式事务管理区别编程式事务管理允许用户在代码中精确定义事务的边界;声明式事务管理有助于用户将操作与事务规则进行解耦(基于AOP交由Spring容器来实现 , 实现关注点聚焦在业务逻辑上) 。
概括来说 , 编程式事务管理侵入到了业务代码里面 , 但是提供了更加详细的事务管理 , 而声明式编程由于基于AOP , 所以既能起到事务管理的作用 , 又可以不影响业务代码的具体实现 。
那么如何选择编程式事务管理和声明式事务管理呢?小型应用 , 事务操作少 。建议使用编程式事务管理来实现Transaction Template , 因为它简单、显示操作、直观明显、可以设置事务的名称 。
对于那些大型应用 , 事务操作多 。建议使用声明式事务管理来实现 , 因为它业务复杂度高、关联性紧密 , 关注点聚焦到业务层面 , 实现了业务和事务的解耦 。
关于事务管理器的选择 , 需要基于不同的数据源来选择相对应的事务管理器 , 并选择正确的Platform TransactionManager实现类 , 而全局事务的选择可以使用JtaTransactionManager 。
声明式事务管理的三种实现方式总结在声明式事务管理的三种实现方式中 , 基于TransactionProxyFactoryBean的方式需要为每个进行事务管理的类配置一个TransactionProxyFactoryBean对象进行增强 , 所以开发中很少使用;基于AspectJ的XML方式一旦在XML文件中配置后 , 不需要修改源代码 , 所以开发中经常使用;基于注解的方式开发较为简单 , 配置后只需要在事务类上或方法上添加@Transactiona注解即可 , 所以开发中也经常使用 。
推荐阅读
- 心理委员的职责是什么?
- Spring容器6种注入方式
- 通过深度系统学习Linux用户和组
- 如何正确控制springboot中bean的加载顺序总结
- Spring Boot 2.x基础教程:EhCache缓存的使用
- 黑客全家桶、文字提取利器、深度学习 500 问 | GitHub 热点速览
- 基于机器学习的自适应码率算法的进一步探索与改进
- 军事智能化之机器学习《清明上河图》里几个人几个牲口一览无余
- SpringBoot下使用定时任务的方式全揭秘
- 学习美甲以及美甲注意事项