2013-10-09 77 views
1

我正在試驗JTA事務,並且無法理解爲什麼標記爲始終創建新事務的方法沒有(代碼被編輯爲相關內容)。這是前一個問題,我問一個類似話題的重新工作(here):爲什麼新的JTA交易沒有被創建?

@Stateless 
public class StaffEntityOps 
{ 
    @Resource TransactionSynchronizationRegistry txReg; 

    private void transactionStatus(String where) 
    { 
    String msg; 
    int stat = txReg.getTransactionStatus(); 
    switch (stat) { 
     case STATUS_ACTIVE: 
     msg = "Active"; 
     break; 
     case STATUS_NO_TRANSACTION: 
     msg = "No Transaction"; 
     break; 
     default: 
     msg = "Other: " + stat; 
    } 
    System.out.println("Transaction status in " + where + ": " + msg); 
    } 

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    private void saveToEM(EntityManager em, StaffEntity staffEntity) 
     throws ... 
    { 
    transactionStatus("saveToEM: "); 
    em.persist(staffEntity); 
    em.flush(); 
    } 

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public void add(StaffEntity staffEntity) 
     throws ... 
    { 
    // Entity Managers emDB1 and emDB2 are injected into class. 
    transactionStatus("add: "); 
    saveToEM(emDB1, staffEntity); 
    saveToEM(emDB2, staffEntity); 
    } 

上面的想法,是調用add(StaffEntity staffEntity)方法堅持新StaffEntity到一組非XA數據源。我已經使用bean管理的事務解決了這個問題(前面的問題,上面引用的),還有XA-DataSources。我仍然想確定是否有辦法使用容器管理事務和非XA數據源(主要是瞭解@TransactionAttribute註釋如何影響事物)。

上面的嘗試試圖通過隔離自己的方法中的持久性並用REQUIRES_NEW標記它,爲每個數據庫明確創建一個新事務。這不起作用 - sysout消息表明,在addsaveToEM方法中,都有「無事務」。

爲什麼不是每次調用saveToEM都創建一個新事務?對我來說,add方法有「無交易」,因爲它標記爲NOT_SUPPORTED。但是saveToEM上的REQUIRES_NEW不應該在每次調用時創建一個新事務? (GlassFish 4.0,EclipseLink 2.5)

+0

你如何獲取/設置em實例?您是否嘗試過Glassfish上的JPA示例,例如https://blogs.oracle.com/arungupta/entry/jpa_2_1_implementation_eclipselink? – Chris

+0

每個em實例都有類似'@PersistenceContext(unitName =「jdbc/.. something ..」)的東西EntityManager emdb1;'我應該注意到使用JPA一直工作正常 - 直到我嘗試使用超過1數據源。只要我嘗試同時使用兩者,我會得到一個非XA錯誤(我​​明白)。所以我試圖將persist分離到不同的數據源,以避免使用XA數據源。 – CraftWeaver

+1

我相信因爲saveToEM被本地調用,容器不會爲該調用啓動一個事務。它被視爲只是一種Java方法。 – Chris

回答

0

由於saveToEM在本地被調用,因此它被視爲只是一個java方法,所以容器不會爲該調用啓動一個事務。