本文主要是介绍spring propagation = Propagation.REQUIRES_NEW 注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、spring对于当前事务信息获取
TransactionSynchronizationManager.getCurrentTransactionName();
2、spring使用@Transactional注解生效方式分析
spring方法上添加Transactional注解,意味着为该方法开启一个事务。
事务的传播行为默认:当前如果存在事务,就加入该事务。如果当前不存在,就开启新事务。
需要明确的内容为:
spring事务的实现是通过代理模式,代理该方法的前后进行事务开启和提交
那么如果我对该方法添加一个切面,切面的事务默认就是当前事务。
因为切面的实现也是代理模式,代理对象和事务一致,都是该方法。
3、spring使用@Transactional(propagation = Propagation.REQUIRES_NEW)
通过第二点的分析得出,如果使用新的事务,最简单的方式如下:
@Component
public class UserEntityServiceImpl {@Resourceprivate UserEntityServiceImpl2 userEntityServiceImpl2;@Override@Transactionalpublic UserEntity insertUserEntity(UserEntity userEntity) {log.info("currentTransactionName before[{}]", TransactionSynchronizationManager.getCurrentTransactionName());userEntityServiceImpl2.test();log.info("currentTransactionName after[{}]", TransactionSynchronizationManager.getCurrentTransactionName());return new UserEntity();}
}@Slf4j
@Component
public class UserEntityServiceImpl2 {@Transactional(propagation = Propagation.REQUIRES_NEW)public void test() {log.info("currentTransactionName[{}]", TransactionSynchronizationManager.getCurrentTransactionName());}
}// 输出如下:
currentTransactionName before[org.zhangjiawen.spring.kafka.transaction.contoller.UserEntityController.insertUserEntity]
currentTransactionName[org.zhangjiawen.spring.kafka.transaction.service.impl.UserEntityServiceImpl2.test]
currentTransactionName after[org.zhangjiawen.spring.kafka.transaction.contoller.UserEntityController.insertUserEntity]
4、spring 新事务的不生效以及旧事务回退原因分析
被坑了:新的事务抛出异常,旧事务没捕获,导致新旧事务一起回退
这篇关于spring propagation = Propagation.REQUIRES_NEW 注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!