Spring 事务管理详解 (3)

在spring核心配置文件中添加事务管理器的配置和TransactionProxyFactoryBean代理对象

<!--配置事务管理器--> <bean> <property ref="dataSource" /> </bean> <!--配置业务层的代理--> <bean> <!--配置目标对象--> <property ref="transferService" /> <!--注入事务管理器--> <property ref="transactionManager" /> <!--注入事务属性--> <property> <props> <!-- prop的格式: * PROPAGATION :事务的传播行为 * ISOLATION :事务的隔离级别 * readOnly :是否只读 * -Exception :发生哪些异常回滚事务 * +Exception :发生哪些异常不回滚事务 --> <prop key="transfer*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>

测试代码:

@RunWith(SpringRunner.class) @SpringBootTest public class SpringTransactionApplicationTests { @Autowired TransferService transferService; @Resource(name="transferServiceProxy") TransferService transferServiceProxy; @Test public void contextLoads() { //注意,此处引入的是代理对象transferServiceProxy,而不是transferService transferServiceProxy.transferMoney("Bill","Jack", 200L); } }

运行结果:

java.lang.ArithmeticException: / by zero at com.tx.service.impl.TransferServiceImpl.transferMoney(TransferServiceImpl.java:22) at com.tx.service.impl.TransferServiceImpl$$FastClassBySpringCGLIB$$5196ddf2.invoke(<generated>)

执行service事务方法时抛出异常,事务回滚,数据库中数据未发生改变

数据库.JPG

基于AspectJ的XML方式

在spring核心配置文件中添加事务管理器的配置、事务的增强以及切面

<!--配置事务管理器--> <bean> <property ref="dataSource" /> </bean> <!--配置事务的通知--> <tx:advice transaction-manager="transactionManager"> <tx:attributes> <tx:method propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!--配置切面--> <aop:config> <aop:pointcut expression="execution(* com.tx.service.impl.*ServiceImpl.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1" /> </aop:config>

测试代码:

@RunWith(SpringRunner.class) @SpringBootTest public class SpringTransactionApplicationTests { @Autowired TransferService transferService; @Test public void contextLoads() { transferService.transferMoney("Bill","Jack", 200L); } }

运行结果:

java.lang.ArithmeticException: / by zero at com.tx.service.impl.TransferServiceImpl.transferMoney(TransferServiceImpl.java:22) at com.tx.service.impl.TransferServiceImpl$$FastClassBySpringCGLIB$$5196ddf2.invoke(<generated>)

执行service事务方法时抛出异常,事务回滚,数据库中数据未发生改变

数据库.JPG

基于注解的方式

在spring核心配置文件中添加事务管理器的配置和开启事务注解

<!--配置事务管理器--> <bean> <property ref="dataSource" /> </bean> <!--开启事务注解--> <tx:annotation-driven transaction-manager="transactionManager" />

在事务方法中添加@Transaction注解

@Transactional public void transferMoney(String source, String destination, Long amount) { transferDao.payMoney(source, amount); int i = 100/0; transferDao.collectMoney(destination, amount); }

测试代码:

@RunWith(SpringRunner.class) @SpringBootTest public class SpringTransactionApplicationTests { @Autowired TransferService transferService; @Test public void contextLoads() { transferService.transferMoney("Bill","Jack", 200L); } }

运行结果:

java.lang.ArithmeticException: / by zero at com.tx.service.impl.TransferServiceImpl.transferMoney(TransferServiceImpl.java:24) at com.tx.service.impl.TransferServiceImpl$$FastClassBySpringCGLIB$$5196ddf2.invoke(<generated>)

数据库中数据位发生任何改变

数据库.JPG

总结

在声明式事务管理的三种实现方式中,基于TransactionProxyFactoryBean的方式需要为每个进行事务管理的类配置一个TransactionProxyFactoryBean对象进行增强,所以开发中很少使用;基于AspectJ的XML方式一旦在XML文件中配置好后,不需要修改源代码,所以开发中经常使用;基于注解的方式开发较为简单,配置好后只需要在事务类上或方法上添加@Transaction注解即可,所以开发中也经常使用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyxgx.html