spring的事务
项目发布,用户反馈出现问题(有些数据会回滚,有些不会)。事务出现问题,记录一下。
说明: Consumer类 有事务,但是捕获了异常。FirstService类,没有事务,调用SecondService类方法。SecondService类 ,该方法有事务 ,默认事务配置。RetryAspect类,该方法主要用于拦截加了@RetryService类的注解,然后对于抛出异常的方法保存到数据库进行重试机制。
调用流程:Consumer类接收到请求,然后调用FirstService的methodFS方法,该方法会调用SecondService方法的methodSS方法,FS方法里面有@RetryAspect注解。
spring是通过spring aop来实现声明式事务处理的,具体操作(比如事务实行的配置和读取,事务对象的抽象),用TransactionProxyFactoryBean接口来使用AOP功能,生成proxy代理对象,通过TransactionInterceptor完成对代理方法的拦截,将事务处理的功能编织到拦截的方法中。
事务测试结果:
1.有事务public方法出现异常会回滚;
2.无事务public方法调用本类private方法事务失效,不会回滚;
3.有事务public方法里面捕获了异常,调用另一个带有默认传播的事务的public方法,异常不会回滚;
4.有事务public方法里面捕获了异常,并调用另一个默认传播的事务的public方法(有rollbackfor),嵌套事务都会回滚。会打印一个roll back的日志
5.假设有A抽象类,类上面加了声明式事务,B实现了A。B里面的方法为protected方法,事务不会生效,出现异常,不会回滚。B里面的方法为public方法,事务会生效,出现异常,回滚。
后面会分析源码。