以我的理解,以下代码中的newPrint
方法应该创建一个新事务,但是显然,它打印出与oldPrint
方法中使用的相同的事务状态对象。我从另一个班级打电话给oldPrint。是因为使用this
调用了newPrint吗?如果是,那么何时创建新交易?如果我从另一个类调用这两个方法,则无论如何都会创建两个单独的事务,因为在类级别使用了@Transactional
。
@Transactional
public class Unsubcriber {
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void newPrint() {
System.out.println(TransactionAspectSupport.currentTransactionStatus());
}
public void oldPrint() {
System.out.println(TransactionAspectSupport.currentTransactionStatus());
newPrint();
}
输出:
org.springframework.transaction.support.DefaultTransactionStatus@3bacd0e7
org.springframework.transaction.support.DefaultTransactionStatus@3bacd0e7
Propagation.REQUIRES_NEW
可以工作的情况是什么? 最佳答案
您看到的是关于Spring AOP的类误解。
由于newPrint()
是从同一类内部的方法调用的,因此不会触发任何建议,因此不会进行任何事务处理。
如果您在类之外调用方法newPrint()
,则无论调用者是否已参与事务,都会创建一个新事务。
由于您在类中使用了@Transactional
,因此每个方法均具有默认的@Transactional
设置,这就是为什么您实际上有事务的原因。
请参阅Spring参考文档的this部分,以详细讨论AOP在Spring中的工作方式。
要使您的代码像您期望的那样正常工作,总的骇客如下:
((Unsubcriber ) AopContext.currentProxy()).newPrint();
在this SO post的各个地方都提到了此解决方案。