我正在試驗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消息表明,在add
和saveToEM
方法中,都有「無事務」。
爲什麼不是每次調用saveToEM
都創建一個新事務?對我來說,add
方法有「無交易」,因爲它標記爲NOT_SUPPORTED
。但是saveToEM
上的REQUIRES_NEW
不應該在每次調用時創建一個新事務? (GlassFish 4.0,EclipseLink 2.5)
你如何獲取/設置em實例?您是否嘗試過Glassfish上的JPA示例,例如https://blogs.oracle.com/arungupta/entry/jpa_2_1_implementation_eclipselink? – Chris
每個em實例都有類似'@PersistenceContext(unitName =「jdbc/.. something ..」)的東西EntityManager emdb1;'我應該注意到使用JPA一直工作正常 - 直到我嘗試使用超過1數據源。只要我嘗試同時使用兩者,我會得到一個非XA錯誤(我明白)。所以我試圖將persist分離到不同的數據源,以避免使用XA數據源。 – CraftWeaver
我相信因爲saveToEM被本地調用,容器不會爲該調用啓動一個事務。它被視爲只是一種Java方法。 – Chris