簡體   English   中英

@Transactional,方法里面的方法

[英]@Transactional, method inside method

我有一個方法調用另一個方法的服務。 在第一種方法中,我只使用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
}

謝謝!!

理想的情況應該是

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

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

那將是使用generate方法的事務。 如果發生任何異常,您可以回滾所有異常。 如果要覆蓋該行為。 使用傳播行為

例如:

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

參考交易傳播

經過一番研究,我會回答自己。 如果你認為我錯了,請告訴我一些事情:P

首先,我認為這兩個選項都是正確的,具體取決於您的業務邏輯。 我的意思是,當一個方法必須在同一個事務中完成時,它應該是Transactional,這取決於程序員和業務邏輯。

例如,如果'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
}

如果您的交易(取決於您的業務邏輯)僅在保存方法中,則選項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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM