Spring Don';t覆盖事务中在事务方法内部运行的方法
我在什么地方问过这个问题 假设我有一个使用@transactional在transaction中运行的方法a, 如果存在从该事务方法调用的方法B,默认情况下,该方法也将在同一事务中运行 因此,问题是如何处理B不在交易范围内的情况,Spring Don';t覆盖事务中在事务方法内部运行的方法,spring,transactions,spring-transactions,Spring,Transactions,Spring Transactions,我在什么地方问过这个问题 假设我有一个使用@transactional在transaction中运行的方法a, 如果存在从该事务方法调用的方法B,默认情况下,该方法也将在同一事务中运行 因此,问题是如何处理B不在交易范围内的情况, 如何避免B的事务。您必须使用以下模式来获得您想要的:执行A,如果B需要A的结果,您可以将其发送到非事务上下文中 void myFunction() { Object result = myTransactionalClass.A();
如何避免B的事务。您必须使用以下模式来获得您想要的:执行A,如果B需要A的结果,您可以将其发送到非事务上下文中
void myFunction() {
Object result = myTransactionalClass.A();
B(result);
}
请注意,既然您在问这个问题(您不希望B()是事务性的),那么所提到的代码肯定会起作用。根据两个方法在同一个类中的注释(自调用),下面的代码可能会起作用
@Service
public class TestService {
@Autowired // Self autowiring
TestService service;
@Transactional
public void methodA() {
service.methodB();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void methodB() {
//...
}
}
对服务.methodA()
的外部调用将初始化事务,对服务.methodB()
的自调用将导致methodB()
也成为同一事务的一部分,即使它被注释为不参与事务。
为了解决这个问题,我们进行了自我自动连接,并在该实例上调用methodB()
。这将导致执行methodB()
的事务配置
以下是自动布线的原因:
在代理模式(默认)下,只有外部方法调用
通过代理进入被拦截。这意味着
自调用(实际上是目标对象中的一个方法调用
目标对象的另一种方法)不会导致实际的
即使调用的方法标记为
@事务性的
参考:
以非事务性方式执行,如果需要,则暂停当前事务
存在。类似于同名的EJB事务属性
请仔细阅读共享文档,了解此传播行为的限制。
希望这有帮助方法A和方法B属于同一类?或者是另一个Springbean的一部分,比如说service.a()调用repository.B()?是的,它在同一个类中。是的,这可能是一种方法。我想可能有什么东西阻止你这么做。。从那个人问这个问题的方式来看。是的,我想这就是我要找的,如果我把这个放进去会发生什么(propagation=propagation.NOT_SUPPORTED'如果methodB上没有自动连接,spring txn management要检测应用于某个方法的txn行为,对该方法的调用应该通过代理。当我们直接从另一个方法调用该方法时,不涉及代理。要更好地理解这一点,请通读