Transaction Type:
(1) Resource-local Transaction:Persistence Unit使用native JDBC driver。
(2) JTA Transaction:僅能在JEE Server中使用,可以管理distributed XA Transaction。
CMEM一定使用JTA Transaction,而在JEE Container 中的AMEM則可在兩者中擇一使用,不在JEE Container 中的AMEM僅能使用Resource-local Transaction。
Transaction 與 Persistence Context間的關係:
Synchronization: Persistence Context與Transaction註冊,當Transaction committed 時會通知該Persistence Context,而Persistence Context在收到通知時就應該執行flush將Entity Instances輸出到DB。
Association:Persistence Context與Transaction註冊的動作就是Association,也可以說是在Transaction的scope中啟動Persistence Context。
Propagation:在多個CMEM中的Transaction中共用Persistence Context
與CMEM可以區分為Transaction-Scoped(TRANSACTION)與Extended(EXTENDED)一樣,CMEM可用到的Persistence Context也分為兩類。
Transaction-Scoped Persistence Context:
由CMEM負責,在必要的時候建立TransactionScoped Persistence Context。也就是在CMEM中任意method被呼叫去再確認是否需要。簡單是說,CMEM被動地為每一個Transaction建立一個persistence context,建立的时間點是在CMEM有任意method被呼叫時。
Extended Persistence Context:
基本上由Container負責,當Stateful Session Bean被create時產生,在Stateful Session Bean被removed時結束。與其他Transaction-Scoped的CMEM也能共享此Persistence Context。
而AMEM就可以使用Application-Managed Persistence Contexts。
Application-Managed Persistence Contexts與CMEM使用的Persistence Context最大的差別,在同一個Transaction中,可以存在多個Persistence Contexts。由AMEM自行建立的Transaction可與其他CMEM共享,但如果是要加入其他已建立的Transaction則以joinTransaction()處理。
由於AMEM無法處理Transaction Propagation,所以要共用Persistence Context唯一的辦法就是使用同一個EntityManager instance。而AMEM控制Transaction則是使用EntityTransaction Interface,利用EntityManager.getTransaction()來取得EntityTransaction,再用.begin()、.commit()來控制Transaction。
請記得EntityManager、Persistence Context、Transaction間的差別。
沒有留言:
張貼留言