首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Transactional,方法内部方法

@Transactional,方法内部方法
EN

Stack Overflow用户
提问于 2016-02-24 12:04:27
回答 2查看 12.7K关注 0票数 6

我有一个带有调用另一个方法的方法的服务。在第一个方法中,我只使用SELECT执行查询,但是它们必须看到第二个方法中所做的插入和更新。

那我就得处理交易了。我使用Spring,所以我可以使用@Transactional注释。

下列哪一个选项对您来说似乎更正确?

选项A

代码语言:javascript
复制
@Transactional
public void generate(){
    // selects
    save(a);
    // more selects
}

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

选项B

代码语言:javascript
复制
public void generate(){
    // selects
    save(a);
    // more selects
}

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

谢谢!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-24 15:49:19

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

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

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

选项A

代码语言:javascript
复制
@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

代码语言:javascript
复制
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
}
票数 3
EN

Stack Overflow用户

发布于 2016-02-24 12:13:05

理想情况应是

代码语言:javascript
复制
@Transactional
public void generate(){
    // selects
    save(a);
    // more selects
}

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

也就是说,将使用生成方法的事务。如果出现任何异常,您可以回滚所有。如果你想推翻这种行为。使用传播行为

例如:

代码语言:javascript
复制
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(Object a){
    //save the object
}

参考资料:事务传播

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35601705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档