@Transactional,方法内方法

@Transactional, method inside method

我有一个服务,其中一个方法调用另一个方法。在第一种方法中,我只使用 SELECT 执行查询,但他们必须看到在第二种方法中完成的插入和更新。

然后,我要处理交易。我正在使用 Spring,所以我可以使用 @Transactional 注释。

以下哪个选项更适合您?

选项 A

@Transactional
public void generate(){
    // selects
    save(a);
    // more selects
}

@Transactional
public void save(Object a){
    //save the object
}

选项 B

public void generate(){
    // selects
    save(a);
    // more selects
}

@Transactional
public void save(Object a){
    //save the object
}

谢谢!!

理想情况应该是

@Transactional
public void generate(){
    // selects
    save(a);
    // more selects
}

public void save(Object a){
    //save the object
}

即会使用生成方法的事务。如果发生任何异常,您可以全部回滚。如果你想覆盖行为。使用传播行为

例如:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(Object a){
    //save the object
}

参考Transaction propagation

经过一番研究,我会自己回答。如果您认为我错了,请告诉我一些事情:P

首先,我认为这两个选项都是正确的,这取决于你的业务逻辑。我的意思是,当一个方法必须在同一个事务中完成时,它应该是事务性的,这取决于程序员和业务逻辑。

例如,如果 'generate' 方法包含要在 同一事务 中完成的逻辑,则选项 A 是正确的,因此如果生成方法中的某些内容失败,则所有更改被撤消。在这种情况下,保存方法中的 Transactional 注解是不必要的。

选项 A

@Transactional
public void generate(){
    // selects
    save(a);
    // more selects
}

//@Transactional
public void save(Object a){
    //save the object
}

如果您的交易(取决于您的业务逻辑)仅在保存方法中,则选项 B 也是正确的。但是,如果您使用 Spring 和 AOP(方面),则选项 B 有问题。 Spring在使用AOP的时候使用了proxies,所以如果需要调用带有Transactional注解的save方法,就得使用代理让Spring调用事务中的保存方法。

选项 B

private MyClass self; // this is the proxy bean of this class!

public void generate(){
    // selects
    self.save(a);
    // more selects
}

@Transactional
public void save(Object a){
    //save the object
}