2009-05-07 10 views
0

私はいくつかの仕事をし、DBTransactionsを使用していくつかのストアドプロシージャを呼び出すレガシーメソッドを呼び出します。これらのレガシーメソッド呼び出しのいずれかが失敗した場合、NHibernate Transactionはロールバックする必要があります。NHiberateネストされたトランザクションのブロック

問題は、レガシーメソッドが、NHibernateトランザクションが作成しているデータベース内のデータを使用していることです。これにより、Nhibernateプロセスを待機している間、レガシーコードのSQLプロセスがロックされます。 Nhibernateプロセスは、レガシーSQLプロセスが終了するのを待っているため、デッドロックが発生します。

両方のトランザクションでReadUncommittedを使用しようとしましたが、動作しません。

NHibernate in Actionで推奨されているようにSystem.EnterpriseServicesを使用して分散トランザクションを設定しようとしましたが、どちらも機能していないようです。

ここからどこに行くのかはわかりません。

答えて

1

好みの順番にいくつかのうちの1つを実行できます。

  1. NHibernateの作業が最初に(実行順序に関して)行われている場合は、従来の方法でNHibernateデータベース接続を使用する必要があります。 ISessionは、従来のADOコードに渡すことができるConnectionプロパティを公開します。

  2. これが簡単な場合は、逆の場合もあります。同じ接続を共有している限り、同じトランザクションコンテキストで両方のデータアクセスセットを実行できます。 ISessionFactory.OpenSession()には、IDbConnectionインスタンスをとるオーバーロードがあります。

  3. レガシーメソッドまたはNHibernateメソッドのいずれかを起動する前に、アンビエント暗黙トランザクションを開始します。 Nhibernateとレガシーコードの両方で作業を終えたら、アンビエントトランザクションを完了することによって、それらを同時にコミットすることができます。 (おそらく1または2より実装するのに時間がかかりますので、この3回目だけを入れています)これをどのように扱うかについては、MSDNを参照してください。

  4. 本当に立ち往生してを使用している場合は、を実行しても問題ありませんが、本当に面倒です。 2つの別々の接続を同じデータベーストランザクションにまとめることができます。私はこれをどうやって行うのかについてのリンクを見つけることができないので、あなたがそれを試してみるには十分に苦労しているならば、投稿してください!

+0

ありがとうございました。システムが現在設計されているため、私はオプション3を使いました。 NHibernateやADO Transactionsの代わりにTransactionScopeを使用しました。 TransactionScopeが終了する前にフラッシュし、トランザクションを完了します。 もう一度ご協力いただきありがとうございます。 – Adam

関連する問題