![](/img/trans.png)
[英]Spring transaction handling JMSTemplate inside @Transactional method
[英]@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.