2013-01-24 72 views
1

不得不再次打擾你......(見:CMT Transactions)假定如下:CMT交易(REDUX)

enter image description here

所有TransactionAttributes每默認設置爲REQUIRED

問題:爲什麼是find方法能夠檢索foo,即使前一個提交不應該發生?確實發生了調用find()Foo被插入和選擇的情況,但爲什麼?由於Bar仍然需要存儲,交易目前還沒有結束。

下面的配置已經發生(邦= DuplicateKeyException):

enter image description here

問:爲什麼富保存?我想保存(富富)的方法調用將成爲GlobalService交易的一部分,註釋爲REQUIRED

OK,也許GlobalClient感興趣:Foo-的

public void createFooBar(Foo foo, Bar bar) throws WrappedThingsGoneBadException 
{ 
    try 
    { 
     fooService.create(foo); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    }  

    fooService.doSomethingSilly(); 

    try 
    { 
     foo = fooService.findByName(foo.getName()); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    try 
    { 
     barService.create(bar); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

保存方法和酒吧服務:

public Foo create(Foo foo) 
{ 
    em.persist(foo); 

    return foo; 
} 

說明非常歡迎!

+0

你看到保存美孚在你的數據庫? –

+0

「em」是一個javax.persistence.EntityManager,不是嗎? –

回答

0

我想下面的事情發生了:

  1. 你沒有提交它保存成功的富到數據庫中。
  2. 相同的數據庫用戶讀取未提交的數據。所以找到成功。
  3. Bang將數據庫中保存的Foo回滾。

所以其他數據庫用戶從來沒有看到保存的Foo記錄。你的數據庫用戶看到它,直到回滾發生。

+0

Thx但Foo持久存儲在數據庫中。這真的讓我瘋狂; 'em'是EntityManager,注入@PersistenceContext。 – Subcomandante

+0

你確定你在任何地方都使用require而不require_new嗎? –

+0

是的,絕對確定...因爲下一個示例使用REQUIRES_NEW,並且所有內容都按預期工作。 – Subcomandante