2011-12-02 2 views
8

Grails Webアプリケーションを使って作業していて、Grailsサービスを使用すると非常に奇妙なことが起こります。ですから、Grailsのサービスについてもっと理解してもらうために、これに関するいくつかの質問をしたいと思います。これは私のために非常に役立ちます(そして多分他人のために^ _ ^)。前もって感謝します。サービスがtrue =静的トランザクションで構成されている場合、任意の方法が汚れているとHibernateセッションにロックされているオブジェクトと起動後Grailsサービスに関するいくつかの質問

  1. 、それはDBにすべてのデータ変更をフラッシュするのだろうか?

  2. static transactional = trueではなく、クラスレベルで@Transactionalアノテーションを使用できますか?そして、私はちょうど彼らが(クエリ、見つける)DBからデータを読み取るようにいくつかの方法で@Transactional(readOnly = true)を置く可能性がありますか?

  3. トランザクション継承はどうですか?親サービスがstatic transactional = trueに設定されていて、子サービスが@Transactional注釈(クラス上)および一部の@Transactional(readOnly = true)(一部のメソッドで)を所有している場合、子の親からメソッドを呼び出すとどうなりますか?

  4. トランザクションは、抽象サービスで動作しますか?私が知っているように、抽象サービスでBeanを初期化することはできませんし、アプリケーションを起動するときにGrailsコンテキストにいくつかの違いがあります。

答えて

7

あなたははい、質問#1の場合は質問ごとに一つの質問:)

を依頼する必要があります - 春/ Hibernateの統合は、コミットする前にフラッシュが起こることを保証します。したがって、save()delete()へのコールはフラッシュされ、どちらにもflush: trueを追加する必要はありません。また、save()を呼び出していない汚れたインスタンスは、discard()を呼び出さない限り、フラッシュされます。

#2の場合:サービスはデフォルトでトランザクションであるため、transactional = trueは実際には冗長です。transactional = falseと指定する必要があります。しかし、作成された自動トランザクションラッパーは、@Transactional注釈がない場合にのみ実行されます。 1つまたは複数の注釈がある場合、それらはトランザクション境界を定義します。したがって、デフォルトでは(注釈がなく、transactionalプロパティまたはtransactional = true)、すべてのメソッドはトランザクションですが、メソッドのサブセットにのみ注釈を付けると、それらはトランザクションのみになります。デフォルト以外の動作、すなわち、カスタムの伝播、隔離、タイムアウトなど(あるいはそれが読み取り専用のあなたの例のようになって)をしたいとき

通常は、注釈を使用します。

クラスレベルで注釈を付けると、すべてのメソッドで同じ設定を使用できます。また、オプションで個々のメソッドにアノテーションを付けて、クラススコープのデフォルトをオーバーライドすることもできます。

#3と#4については、標準規則が適用されます(#2を参照)。サブクラスにアノテーションがある場合、そのクラスまたは親クラスのtransactional = trueは無視されます。アノテーションを使用することで、自分で設定していることをGrailsに伝えているからです。抽象サービスをインスタンス化することはできませんので

、実際にインスタンス化されます具象サブクラスは、基本クラス自体からの動作を組み合わせています。すべてがtransactional = trueの場合は単純ですが、注釈がある場合はルールを定義します。

スーパークラス内のメソッドの呼び出しは、現在のクラス内のメソッドの呼び出しと同じように動作します。しかし、Springのプロキシ・アプローチの意味を考慮していなければ、その動作は少し直感的です。トランザクションメソッドを呼び出すと、プロキシはコールをインターセプトし、アクティブなトランザクションに参加するか、必要に応じて新しいトランザクションを開始するか、REQUIRES_NEWが指定されている場合は新しいトランザクションを開始します。しかし、あなたが本当のクラスに入り、別のメソッドを呼び出すと、プロキシをバイパスします。したがって、異なる注釈設定で別のメソッドを呼び出すと、それらは無視されます。もしあなたがそれをやろうとしたら、このメーリングリストの議論で何が起こっているのか、そしてそれをどう操作するのかを見てください:http://grails.1312388.n4.nabble.com/non-transactional-service-extends-transactional-service-outcome-td3619420.html

+0

恐ろしいです!あなたの明確な答えをありがとうございました。親サービスAはクラスレベルで@Annotationとマークされ、AのメソッドdoParent()はreadOnly = trueであり、子サービスBはトランザクションに関する特定の構成を持っていません。なぜBからdoParent()を呼び出すのですか、私はreadOnlyを強制しますが、それでもデータをフラッシュしますか? –

関連する問題