我需要在三个数据库中执行分布式事务。为此,我在我的服务中注入了三个会话工厂。我使用以下代码管理事务:
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 :(得分: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;
...
}