2013-05-31 28 views
6

私の質問はNHibernateはsession.BeginTransaction()対transaction.Begin()

が問題以下transaction.Begin()ですNHibernateの取引の使用に関連していますか?または単に冗長ですか?

using (var transaction = session.BeginTransaction()) 
{ 
    transaction.Begin(); 
    action(); 
    transaction.Commit(); 
} 
+1

ブックマークする:http://ayende.com/blog/3775/nh-prof-alerts-use-of-implicit-transactions-is-discouraged – Freelancer

+0

読書Ayendeは常に良いです...しかし、この場合、私の質問に答えません – SteveM

答えて

8

ソースを確認した後、transaction.Begin()は実際には冗長です - 無害なノーオペレーションです。

link to source

3

beginTransactionそれがトランザクションを開始すると述べて、

一方、ヌルが1を作成する場合

session.Transactionは、現在のアクティブなトランザクションが返されます。

NHibernateセッションは、現在アクティブな(コミットされていないか、ロールバックされた ロールバック)トランザクションを追跡します。

トランザクションがまだ は、セッションの寿命の間にまだ作成されていない場合、あなたがISession.Transactionを呼び出すと、セッションは その時点で新しいトランザクションオブジェクトを作成しますが、まだ にそれを開始しません。 ISession.BeginTransactionを呼び出すと、セッションは が既に作成されていてまだ完了していないトランザクションオブジェクトであれば と表示されます。そうであれば、このトランザクションオブジェクトを返します。 そうでなければ、新しいトランザクションオブジェクトを作成し、それを開始し、 この新しいオブジェクトへの参照を格納します。取引完了時に

は、トランザクションオブジェクトは、セッション に通知し、それがどのセッションが トランザクション・オブジェクトへの参照を解放し、完了したことを所属します。その後、 ISession.TransactionまたはISession.BeginTransactionを呼び出すと、新しいトランザクションオブジェクトが作成されます( )。

NHibernateは、 トランザクション以上のトランザクションオブジェクトの再利用をサポートしていません(この動作は、トランザクションオブジェクトの再利用をサポートすると思われるHibernateとは異なる場合があります)。

thisを参照してください。

+0

ちょっと混乱します... beginTransactionはセッションに現在のトランザクションがない場合にのみ新しいトランザクションを作成し、それ以外の場合は既存のトランザクションを返します。この場合、後続のtransaction.Begin()にどのような影響がありますか?それはノーオペレーションですか? – SteveM

関連する問題