2

分散トランザクションで DB2 データベースを (NHibernate 経由で) 更新しようとしていますが、失敗し続けます。

ここに私が書いたコードがあります:

public bool ExecuteUsingDTC(List<Func<bool>> tasks)
{
    var result = false;
    using (var scope = new TransactionScope(TransactionScopeOption.Required))
    {
        using (var session = sessionFactory.OpenSession())
        using (var transaction = session.BeginTransaction())
        {
            //carry out db modification tasks
            tasks.ForEach(task => { result = result && task.Invoke(); })
            transaction.Commit();
        }
        scope.Complete();
    }

    return result;
}

私は例外を取得し続けます:

NHibernate.TransactionException was unhandled by user code
Message=Begin failed with SQL exception
Source=NHibernate
StackTrace:
   at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
   at NHibernate.Transaction.AdoTransaction.Begin()
   at NHibernate.AdoNet.ConnectionManager.BeginTransaction()
   at NHibernate.Impl.SessionImpl.BeginTransaction()
   at DTCProofOfConcept_Repository.ExecuteUsingDTC(List`1 tasks) in C:\Project\Infrastructure\GlobalRepositories\DTCProofOfConcept_Repository.vb:line 20
   at 

InnerException: IBM.Data.DB2.DB2Exception
   ErrorCode=-2147467259
   Message=ERROR [HY011] [IBM] CLI0126E  Operation invalid at this time. SQLSTATE=HY011
   Source=IBM.Data.DB2
   StackTrace:
        at IBM.Data.DB2.DB2Connection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode)
        at IBM.Data.DB2.DB2Transaction.set_AutoCommit(Boolean value)
        at IBM.Data.DB2.DB2Transaction.BeginTransaction()
        at IBM.Data.DB2.DB2Connection.BeginTransactionObject(IsolationLevel isolevel)
        at IBM.Data.DB2.DB2Connection.BeginTransaction(IsolationLevel isolevel)
        at IBM.Data.DB2.DB2Connection.BeginTransaction()
        at IBM.Data.DB2.DB2Connection.System.Data.IDbConnection.BeginTransaction()
        at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
   InnerException: 
4

1 に答える 1

1

このようにTransactionScopeを使用する

using(var scope = new TransactionScope(...))
{

    transaction.Complete();
}

トランザクションを開始してコミットします。例外がスローされた場合、Completeが呼び出されずにスコープが破棄されると、トランザクションは中止されます。

あなたの問題は、BeginTransaction/Commitへの追加の明示的な呼び出しがあることだと思います。それらを削除し、NHibernateがTransactionScopeでうまく機能すると仮定すると、すべて問題ないはずです。

TransactionScopeの使用には、分散トランザクションコーディネーター(DTC)の使用が含まれる場合があります。その場合は、管理ツール|コンポーネントサービスを開く必要があります。分散トランザクションコーディネーター|ローカルDTCに移動します。右クリック、プロパティ、セキュリティタブ。セキュリティを有効にし、最初にすべてを有効にします。これが機能する場合は、DTCセキュリティを確認し、最小限に抑えてください。

または、DanVallejoが提案したように、TransactionScopeを削除して、明示的なトランザクションを使用します。

于 2012-04-30T21:36:00.740 に答える