我有一个带有调用另一个方法的方法的服务。在第一个方法中,我只使用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
}谢谢!!
发布于 2016-02-24 15:49:19
经过一番研究,我会回答自己的问题。如果你认为我错了,告诉我:P
首先,我认为这两个选项都是正确的,这取决于您的业务逻辑。我的意思是,当方法必须在同一个事务中完成时,它应该是事务处理的,这取决于程序员和业务逻辑。
例如,如果“generate”方法包含要在相同事务中执行的逻辑,则选项A是正确的,因此,如果generate方法中的某些内容失败,则所有更改都将被撤消。在这种情况下,保存方法中的事务注释是不必要的。
选项A
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
//@Transactional
public void save(Object a){
//save the object
}如果您的事务(取决于业务逻辑)仅在保存方法中,则选项B也是正确的。但是,如果使用Spring和AOP (方面),则选项B中有错误。在使用AOP时,Spring使用代理,因此如果需要使用事务注释调用保存方法,则必须使用代理让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
}发布于 2016-02-24 12:13:05
理想情况应是
@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
}参考资料:事务传播
https://stackoverflow.com/questions/35601705
复制相似问题