@Transactional,方法内的方法

jpa*_*dev 5 java spring jpa transactional

我有一个带有调用另一种方法的方法的服务。在第一种方法中,我只使用 SELECT 执行查询,但他们必须查看在第二种方法中完成的 INSERTS 和 UPDATES。

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

以下哪个选项似乎更适合您?

选项 A

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

@Transactional
public void save(Object a){
    //save the object
}
Run Code Online (Sandbox Code Playgroud)

选项 B

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

@Transactional
public void save(Object a){
    //save the object
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!

jpa*_*dev 3

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

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

例如,如果“generate”方法包含要在同一Transaction中完成的逻辑,则选项 A 是正确的,因此如果generate 方法中的某些内容失败,则所有更改都将被撤消。在这种情况下,save方法中的Transactional注释是不必要的。

选项A

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

//@Transactional
public void save(Object a){
    //save the object
}
Run Code Online (Sandbox Code Playgroud)

如果您的事务(取决于您的业务逻辑)仅在 save 方法中,选项 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
}
Run Code Online (Sandbox Code Playgroud)

  • @SeyyedMahdiyarZerehpoush是的,所以如果您调用事务性generate()方法,然后非事务性save()方法失败,则generate()将回滚(因为您说整个方法generate()是事务性的) (2认同)