多个会话工厂中的 TransactionScope

TransactionScope in multiple session factories

我需要在三个数据库中执行分布式事务。为此,我在服务中注入了三个会话工厂。我使用以下代码管理交易:

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();
}

wich 工作得很好而且花花公子,问题是如果我在事务完成之前发出 return 语句,第二个会话工厂会进入不一致状态,并且在下一次调用中会抛出异常当我尝试打开会话时:

Distributed transaction complete. Either enlist this session in a new transaction or the NULL transaction.

我需要嵌套结构,因为我在实体操作部分发出了不确定数量的命令,每个命令都在三个数据库中进行更改。

这个问题的一个解决方法是避免不同会话的嵌套,如果之后需要一个先前关闭的会话的对象,可以声明它不使用原始会话并传递给下面的,相同的可以使用先前关闭的会话中需要的任何信息来完成。

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;
     ...
}