2013-08-01 4 views
5

次のアクションの違いは何ですか?withTransactionとwithNewTransactionの違いは何ですか?

def someAction() { 
    User.withTransaction { ... } 
} 

def someAction() { 
    User.withNewTransaction { ... } 
} 
  1. は、私が何をするときに使うのですか?

  2. grailsアクションにTransactionブロックのみが含まれている場合。この場合、withTransactionとwithNewTransactionは同じです。各アクションには独自のトランザクションがあるためです。これは本当ですか?

+1

すでに存在する場合は最初の変種が既存のトランザクションに参加するか、そうでない場合は最初のトランザクションが参加し、すでにエクスクルーセートしているかどうかにかかわらず新しいトランザクションが開始されます。 – cmbaxter

+0

質問を更新しました。質問2についてどう思いますか? – confile

+0

私は@ cmbaxterに同意します。ちょっとした注意:コントローラーはできるだけシンプルで、要求を処理するだけです。トランザクションを処理する必要がある場合、サービスはより良い場所になります(すでにトランザクションが行われています)。 –

答えて

10

私はこれらの機能がトランザクション分離のセマンティクスと関係していると考えています。 withTransaction関数は、既存のトランザクションが既に開始されている場合はそのトランザクションに参加し、存在しない場合は新しいトランザクションを開始します。 withNewTransactionメソッドは、既に開始されているかどうかにかかわらず、常に新しいトランザクションを開始し、そのブロック内のコードを独自のトランザクションに分離します(独自のコミット/ロールバックを使用)。

開発中のメソッドが複数の別々のdb書き込みでより大きなトランザクションに参加する必要があると考えられる場合は、withTransactionを使用して、必要に応じてより大きなトランザクションに参加する必要があります。別のトランザクションが行われている場合に、このコードを他のDB書き込みと完全に分離したい場合は、withNewTransactionを使用してください。

あなたの質問については、2つは、両方とも新しいトランザクションを開始するので、アクションで唯一の呼び出しである場合、2つは同じ動作をします。

関連する問題