質問

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でコミットが呼び出されるとどうなりますか?トランザクションはコミットされますか?成功するか失敗するにはすべてが必要です。

役に立ちましたか?

解決

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

しかし、あなたの場合 しなければならない 何らかの理由で「サービス」レベルで開始/コミットを維持すると、すべてを包むことができます TransactionScope, 、あなたはそれを Complete() すべてが成功した後にのみ。

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top