【问题标题】:NHibernate - Distributed transactions and providing your own connection result in exceptionNHibernate - 分布式事务和提供您自己的连接导致异常
【发布时间】:2011-05-12 16:11:52
【问题描述】:

NHibernate 在参与分布式事务并且您已通过指定自己的连接对象打开会话时抛出异常。

Unhandled Exception: System.InvalidOperationException: Disconnect cannot be call
ed while a transaction is in progress.
   at NHibernate.AdoNet.ConnectionManager.Disconnect()
   at NHibernate.Impl.SessionImpl.Close()
   at NHibernate.Impl.SessionImpl.Dispose(Boolean isDisposing)
   at NHibernate.Transaction.AdoNetWithDistrubtedTransactionFactory.<>c__Display
Class1.<EnlistInDistributedTransactionIfNeeded>b__0(Object sender, TransactionEv
entArgs e)
   at System.Transactions.TransactionCompletedEventHandler.Invoke(Object sender,
 TransactionEventArgs e)
   at System.Transactions.TransactionStatePromotedCommitted.EnterState(InternalT
ransaction tx)
   at System.Transactions.InternalTransaction.DistributedTransactionOutcome(Inte
rnalTransaction tx, TransactionStatus status)
   at System.Transactions.Oletx.RealOletxTransaction.FireOutcome(TransactionStat
us statusArg)
   at System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(Transact
ionStatus status)
   at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback
(Object state, Boolean timeout)
   at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback
(Object state, Boolean timedOut)

以下代码将重现该问题;参考当前的 FluentNibernate 和 NHibernate 2.1.2.4000。

using System;
using System.Data.SqlClient;
using System.Transactions;

using FluentNHibernate.Mapping;
using FluentNHibernate.Cfg.Db;
using FluentNHibernate.Cfg;

namespace ConsoleApplication2
{
  class Program
  {
    static void Main(string[] args)
    {
      var cfg =
        Fluently.Configure().Database(
          MsSqlConfiguration.MsSql2008.ConnectionString("Integrated Security=SSPI;Data Source=.;Initial Catalog=Test").DefaultSchema("dbo")
        ).Mappings(x => x.FluentMappings.AddFromAssemblyOf<MyTableMap>()).BuildConfiguration();

      using (var sf = cfg.BuildSessionFactory())
      {
        using (var ts = new TransactionScope().PromoteToDtc())
        {
          using (var conn = new SqlConnection("Integrated Security=SSPI;Data Source=.;Initial Catalog=Test"))
          {
            conn.Open();

            using (var session = sf.OpenSession(conn))
            {
              session.Save(new MyTable { String = "Hello!" });
            }
          }

          ts.Complete();
        }

        Console.WriteLine("It saved!");
        Console.ReadLine();
      }
    }
  }

  public class DummyEnlistmentNotification : IEnlistmentNotification
  {
    public static readonly Guid Id = new Guid("E2D35055-4187-4ff5-82A1-F1F161A008D0");

    public void Prepare(PreparingEnlistment preparingEnlistment)
    {
      preparingEnlistment.Prepared();
    }

    public void Commit(Enlistment enlistment)
    {
      enlistment.Done();
    }

    public void Rollback(Enlistment enlistment)
    {
      enlistment.Done();
    }

    public void InDoubt(Enlistment enlistment)
    {
      enlistment.Done();
    }
  }

  public static class TSExetensions
  {
    public static TransactionScope PromoteToDtc(this TransactionScope scope)
    {
      Transaction.Current.EnlistDurable(DummyEnlistmentNotification.Id, new DummyEnlistmentNotification(), EnlistmentOptions.None);
      return scope;
    }
  }

  public class MyTable
  {
    public virtual int Id { get; private set; }
    public virtual string String { get; set; }
  }

  public sealed class MyTableMap : ClassMap<MyTable>
  {
    public MyTableMap()
    {
      Id(x => x.Id).GeneratedBy.Native();
      Map(x => x.String).Not.Nullable();
    }
  }
}

【问题讨论】:

  • 堆栈和异常表明您的分布式事务仍在进行中。您的交易是如何创建/管理的?
  • 我们什么都没做,NServiceBus 会在调用我们的消息处理代码之前和之后自动启动和 cets 一个分布式事务。

标签: nhibernate distributed-transactions sessionfactory


【解决方案1】:

问题确实出在 NIBerate 上。他们正在开发补丁。供参考,问题可以找到here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多