Infinispan documentation說它的鎖定方案很多東西,樂觀和悲觀,但沒有詳細說明如何使用交易。可能它被認爲是知道的,因爲它使用Java的默認API,但如果是這樣,我也無法找到關於JTA使用模式。如何使用Infinispan使用JTA事務?
在使用樂觀事務時,我假設它將被提交或回滾,具體取決於對數據的併發訪問,如果回滾,我將能夠重放交易,希望現在它會在其他併發訪問之前完成並且會成功。我在TransactionManager上有begin(),commit()和rollback()方法,以及我不確定什麼時候會拋出的嚴重記錄異常。有了這些信息,我編了這段代碼:
public void transactionSum(Key key, Long delta) {
boolean redo;
do{
redo = false;
try {
tm.begin();
try {
Long value = cache.get(key);
// Some processing:
value += delta;
cache.put(key, value);
tm.commit();
} catch(CacheException e) {
tm.rollback();
throw new RollbackException();
}
} catch (RollbackException e) {
redo = true;
logger.debug("Cache transaction collision, replaying it.");
} catch (Exception e) {
logger.error(e.getMessage());
}
} while(redo);
}
此編碼是否正確?這似乎過於複雜的執行一個被認爲是常見的操作,因此我懷疑我做了一些錯誤的事情......如果cache.put()
失敗,會拋出一些CacheException
?如果是這樣,我是否應該明確地撥打tm.rollback()
?如果我在finally
子句中調用tm.commit()
怎麼辦?什麼時候會拋出RollbackException
?
更重要的是,有沒有一些成語/默認的方式來執行交易重播?
順便說一句,狀態是真的:javax.transaction.Status –
+1爲鏈接 –