TransactionScope在多个会话工厂中

时间:2015-02-17 23:26:43

标签: nhibernate distributed-transactions

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

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事务。

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

1 个答案:

答案 0 :(得分: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;
     ...
}