@Transactional,方法里面的方法

时间:2016-02-24 12:04:28

标签: java spring jpa transactional

我有一个Service,调用另一个方法。在第一种方法中,我只使用SELECT执行查询,但是他们必须在第二种方法中看到INSERTS和UPDATES。

然后,我必须处理交易。我使用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
}

谢谢!

2 个答案:

答案 0 :(得分:3)

理想情况应该是

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

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

即将使用generate方法的事务。如果发生任何异常,您可以回滚所有异常。如果要覆盖该行为。使用传播行为

E.g:

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

参考Transaction propagation

答案 1 :(得分:1)

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

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

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

选项A

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

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

如果您的交易(仅取决于您的业务逻辑)仅在保存方法中,则选项B也是正确的。但是如果您使用Spring和 AOP (Aspects),则选项B中存在问题。 Spring在使用AOP时使用代理,因此如果需要使用Transactional注释调用save方法,则必须使用代理让Spring在Transaction中调用save方法。

选项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
}