2012-05-16 59 views
2

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

更重要的是,有沒有一些成語/默認的方式來執行交易重播?

回答

3

正確的模式是:

Transaction tx = tm.begin(); 
try 
{ 
// DO SOMETHING 
} 
catch (Exception e) 
{ 
    tx.setRollbackOnly(); // Force a rollback for this error 
    throw e; 
} 
finally 
{ 
    if (tx.getStatus() == Status.STATUS_ACTIVE) 
     tx.commit(); 
    else 
     tx.rollback(); 
} 

沒有一個功能性的語言,要消耗這種最簡單的方式是通過可調用或類似的模式,即https://github.com/galderz/infinispan/blob/master/core/src/test/java/org/infinispan/test/TestingUtil.java#L1307

更新:有沒有功能重新嘗試在Infinispan的交易

+0

順便說一句,狀態是真的:javax.transaction.Status –

+0

+1爲鏈接 –