2013-02-25 230 views
1

我有代碼事務劃分編程。春季編程交易

目前我的隔離度設置爲PROPAGATION_REQUIRES_NEW。哪些工作正常,但我需要迎合遞歸行爲,並且我不想創建一個新的事務,如果方法從同一個線程再次調用。

1)如果第一次調用該方法,暫停當前事務並創建新事務。 PROPAGATION_REQUIRES_NEW

2)如果它被遞歸調用。不要創建新的交易。

例如:我有,它的工作原理是。我不想要的是使用AtomicInterger。有任何想法嗎?

public methoda() { 

    Integer entrancy = rentrancy.incrementAndGet(); 

    if(entrancy == 1) { 
      this.transactionTemplate.setPropagationBehavior(..PROPAGATION_REQUIRES_NEW); 
    } 

    this.transactionTemplate.execute(new TransactionCallback<E>(){ 
     ....... 
     ....... 
    } 
    entrancy.decrementAndGet(); 
} 

回答

1

聽起來像PROPAGATION_REQUIRED更適合您的目的。來自javadoc:

支持當前交易;如果不存在,則創建一個新的。

+0

不,它不會因爲我第一次調用這個方法時需要一個新的事務。但如果它遞歸,我不想要另一個新的交易。 – user1555190 2013-02-25 13:37:49

+2

我會以一種只在第一次調用時創建事務的方式來重構代碼,也許會將這個方法拉到另一個方法。這比干擾條件傳播模式等乾淨。 – mrembisz 2013-02-25 13:53:12

0

我不確定我的「解決方法」是否可行,因爲我現在無法測試它。 但是 - 如果使用anotation(@Transactional)進行定義事務,則只有在調用external的方法時纔會創建事務。如果方法調用self,則不是。這是如此替代代理。

「注意:由於此機制基於代理,因此只有通過代理進入的」外部「方法調用纔會被攔截,這意味着」自我調用「,即目標對象內的方法調用其他方法的目標對象在運行時不會導致實際事務,即使調用的方法標記爲@Transactional!「 http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html