java Spring传播。需要新的
据我所知,下面代码中的newPrint
方法应该创建一个新事务,但显然它打印出了与oldPrint
方法中使用的相同的事务状态对象。我从另一个班打电话给oldPrint。是因为newPrint是使用this
调用的吗?如果是,那么何时创建新事务?如果我从另一个类调用这两个方法,无论如何都会创建两个单独的事务,因为@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
起作用时,会出现什么情况
# 1 楼答案
假设geoand的编辑澄清是真的,那么您的问题的答案是Spring使用AOP代理来应用事务限制。所以,当来自外部的呼叫进入你的退订者时,这将起作用,然后可以拦截这些呼叫,并应用事务边界。如果你从你的类中调用它,就像你说的,使用“this”,那么就没有代理可以完成,因此你的@Transactional将不会发挥作用
# 2 楼答案
你看到的是一个关于Spring AOP的班级误解
由于
newPrint()
是从同一类内的方法调用的,因此不会触发任何通知,因此不会进行事务处理如果在类外调用方法
newPrint()
,则无论调用方是否已参与事务,都将创建一个新事务因为您在类上使用了
@Transactional
,所以每个方法都会得到默认的@Transactional
设置,这就是为什么您实际上有一个事务查看Spring参考文档的this部分,详细讨论AOP在Spring中的工作方式
要让你的代码像你期望的那样工作,一个彻底的黑客攻击是:
这个解决方案在许多地方都有提及,其中就有thisSO post