2015-02-17 44 views
1

我需要在三個數據庫中執行分佈式事務。爲此,我在我的服務中注入了三個會話工廠。我管理與下面的代碼交易:多個會話工廠中的TransactionScope

using(var ts = new TransactionScope(TransactionScopeOption.RequiresNew, 
new TransactionOptions() { IsolationLevel = RepeatableRead })) 
using(var session1 = _sessionFactory1.OpenSession()) 
using(var tran1 = session1.BeginTransaction() 
using(var session2 = _sessionFactory2.OpenSession()) 
using(var tran2 = session2.BeginTransaction() 
using(var session3 = _sessionFactory3.OpenSession()) 
using(var tran3 = session3.BeginTransaction() 
{ 
    //Entity manipulation 
    tran1.Commit(); 
    tran2.Commit(); 
    tran3.Commit(); 
    ts.Complete(); 
} 

至極運作良好,花花公子,問題是,如果我發出交易完成前return語句,第二屆工廠獲取一個不一致的狀態,在下次調用時,當我嘗試打開會話時拋出異常:

分佈式事務完成。請在新的 事務或NULL事務中加入此會話。

我需要嵌套結構,因爲我在實體操作部分中發出了一定數量的命令,每個命令都在三個數據庫中進行更改。

回答

0

解決此問題的方法是避免嵌套不同的會話,如果之前需要先前關閉的會話的對象,則可以將它聲明爲使用原始會話並傳遞給以下內容,同樣可以完成任何以前閉幕會議提供的信息。

Client client; 
using(var session1 = _sessionFactory1.OpenSession()) 
{ 
    ... 
    client = session1.Get<Client>(myClientId); 

    ... 
} 

using(var session2 = _sessionFactory2.OpenSession()) 
{ 
    ... 
    product = _session2.Load<Product>(myProductId); 
    product.ClientId = client.Id; 
    ... 
}