2017-02-03 4 views

答えて

10

最近の3.1.xバージョンを除くすべてのサービスを除いて、Grailsのほとんどのトランザクションはデフォルトでトランザクションされません。古いバージョンでは、トランザクションの振舞いに対して何も設定されていない場合、トランザクションプロキシが適用されるため、すべてのパブリックメソッドはトランザクションになります。 static transactional = falseで無効にしたり、@Transactionalアノテーションでトランザクションの動作をカスタマイズしたりできます。サービスでは@Transactionalの注釈を使用することはできますが(そしてそうするべきです)、自動トランザクション性を無効にする必要はありません。

生成されたコントローラとサービスには@Transactionalアノテーションが含まれていますが、それはあなた自身で追加する作業を保存するための簡単な方法です。

コントローラは、コントローラに混乱したコードがたくさん残ってしまうので、トランザクション作業を行うには悪い場所ですが、懸念事項を分けて、コードを置くことが重要です(例えば、GSP、ドメインプロパティ、ドメインクラスの制約、トランザクションデータベース書き込み、サービス内のビジネスロジックなど)を提供します。

リクエストパラメータのデータバインディングとルーティングロジックをコントローラに残し、トランザクションごとに明示的にコンフィグレーションされたサービスに永続性とビジネスロジックを移動するかどうかは、クラスやメソッドごとに必要なものに応じて、コントローラがサービスや他のヘルパーを呼び出させるようにします。

このアプローチでは、コードをよりメンテナンス可能にするだけでなく、メソッドやクラスがより簡単で集中的になるため、すべてを適切にテストすることも容易になります。

関連する問題