1

nhibernate がネストされたトランザクションをサポートしていないことは知っています。

私がこのようなものを得たとしましょう:

  1. UserService.BeginTransaction (現在のセッションで)
  2. UserService.Save
  3. UserService->FeedService
    1. FeedService.BeginTransaction (現在のセッションで)
    2. FeedService.Save
    3. FeedService.Commit (#3.1 で返されたトランザクションで)
  4. UserService->AddressService
    1. AddressService.BeginTransaction (現在のセッションで)
    2. AddressService.Save
    3. AddressService.Commit (#4.1 で返されたトランザクションについて)
  5. UserService.Commit (#1 で返されたトランザクションで)

#3.3 でコミットが呼び出されるとどうなりますか?トランザクションはコミットされますか? 成功するか失敗するかのいずれかが必要です。

4

2 に答える 2

0

はい。3.1のBeginTransaction呼び出しは、アクティブなトランザクションがすでに存在するため、何もしません。すべての操作を同じトランザクションに参加させたい場合は、3.xおよび4.xでBegin /EndTransactionを呼び出さないでください。

私のアドバイスは、サービスクラスまたはリポジトリクラスでトランザクションを使用しないことです。UIレベルでトランザクションを制御するか、ビジネスプロセスをカプセル化するクラスを作成します。

于 2010-09-21T17:38:42.777 に答える
0

Jamie が言ったように、このような状況を回避するには、トランザクションをより高いレベルで管理する必要があります。

ただし、何らかの理由で開始/コミットを「サービス」レベルに保持する必要TransactionScopeがある場合は、すべてを でラップできます。これはComplete()、すべてが成功した後にのみ行います。

于 2010-09-21T19:32:40.587 に答える