2012-11-10 34 views
5

EJB事務假設我有一個實現所需的交易方法的會話bean:與調用POJO

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void doTransaction() throws Exception { 
    try { 
     ... 
     // call to non-EJB bean object (not session, stateless or entity bean) 
    } catch (Exception e) { 
     context.setRollbackOnly(); 
     throw e; 
    } 
} 

假設doTransaction()改變非bean對象的內部狀態,和失敗。回滾是否恢復了非bean的原始狀態? 如果不是,那麼推薦的方法是什麼來處理這種情況? (或者POJO內部的交易是不允許的?)

+0

你可以舉一個這個pojo的例子,它是一個靜態類變量嗎?我有這樣的感覺,你正試圖做一些可以做得不同的事情 –

回答

5

EJB自動完成的回滾拋出異常,只會影響已加入正在進行的(JTA)事務的資源。

有幾種方法可以加入這種交易。最完整的方法是通過實現XAResource接口並讓您的代碼徵用該實現。更簡單但不太有效的方法是使用Synchronizer

嚴格地說,EJB容器或事務管理器本身都不會回滾任何東西。相反,它爲入伍的資源提供了這樣一個回滾的機會。因此,它本身永遠不會能夠恢復事務期間恰好被修改的隨機變量的先前值。數據庫連接(如果它們來自容器管理的數據源),JMS消息(同樣,如果目的地是容器管理的),(分佈式的),(分佈式的) )緩存和基於JCA的EIS資源。

0

JavaEE不會回滾非豆的更改。它將回滾的唯一東西是實體,但是隻有在從數據庫中再次讀取它們之後。

如果您想要這種語義,您需要使用Software Transactional Memory產品。