我有一个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
}
谢谢!
答案 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
}
答案 1 :(得分:1)
首先,我认为这两个选项都是正确的,具体取决于您的业务逻辑。我的意思是,当一个方法必须在同一个事务中完成时,它应该是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
}