2009-03-08 9 views
3

私は、どのメソッドがトランザクションであるかを定義するためにSpring AOPを使ったアプリケーションを書きました。私は今、これがいかにすばらしいアイデアであったかについて、二番目の考えを持っています。私は実際に何かが間違っている(そして私は論理的に一貫性のないデータベースがある)まで、明らかに現れないマイナーリファクタリング(メソッドシグニチャの変更など)の後に数回ヒットしました。データベーストランザクション管理にAOPを使用しますか?

だから、私はいくつかのことに興味がある:

  1. は、他の人が(例えば@Transactional注釈を経由して)明示的なトランザクション管理に戻すことを決めたことがありますか?
  2. "壊れた"ものがあるかどうかを確認するのに役立つツールがビルドプロセスの一部として使用できますか?
  3. AOPを使用してトランザクションを管理している場合、私は間違いを避けるためにどのような手順を取っていますか?影響を与える可能性が間違った場所にあるメソッドにパラメータを追加する(私はあなたが装飾されたメソッドを参照することができますし、一緒にメソッド名の変更と春XML設定をリファクタリングしますのIntelliJ IDEAを使用していますが、これは必ずしも十分ではない

答えて

4

現在、私が取り組んでいる2つのJavaプロジェクトで宣言型トランザクション管理を使用しています。具体的には、@Transactional注釈でトランザクションスコープが必要なメソッドを指定しています。私の意見では、柔軟性と堅牢性の良い組み合わせです。単純なテキスト検索を使用してどのメソッドがトランザクション動作をしているかを知ることができ、必要に応じて分離と伝播の属性を手作業で調整でき、 。

これらのプロジェクトの1つでは、セキュリティ/ロギングがアスペクトを介して実装されていますが、メソッドの名前を変更したり、シグネチャを変更したりするときに同じ障害が発生することがあります。最悪の場合、ユーザーアクセス契約のログデータが失われました.1つのリリースでは、一部のユーザーロールがすべてのアプリケーション機能にアクセスできませんでした。大事なことはありませんが、データベースのトランザクションが行われる限り、価値がないと思うので、自分で@Transactionalと入力してください。とにかく、春は難しい部分です。

+0

+1 - Spring 2.5の注釈を活用するのは良いアドバイスです。 – duffymo

+0

私はもともとこれをやっていなかったのは、個々の永続性呼び出しとは対照的に、トランザクショナルでなければならないビジネスロジックであるということです。私はSpringのインポートを全面的に望んでいませんでした。永続化の実装の詳細を可能な限り分離したいのです。 –

+0

右の理由から、@Transactionalアノテーションは永続性の階層ではなくサービス層に属しています。トランザクションとは、サービスで表されるユースケースの作業単位に関するものです。 – duffymo

0

私はもっと純粋主義者になる傾向がありますが、私はすべてのトランザクション管理を、データベース自体の内部で簡単な自動コミットを超えて維持しようとします。ほとんどのデータベースは、トランザクション管理を処理する上で優れています。結局のところ、データベースとは何かを行うための重要なコンポーネントの1つです。

+0

データベースはまだそれをやっています。この取り決めで2フェーズコミットをどのように管理していますか?すべてのプレーヤーを知っている第三者がいなければならず、それは中間層のトランザクションマネージャーです。 – duffymo

+0

これを正しく実行する唯一の方法は、ビジネスロジックをデータベース内で移動することです。たとえば、insert-transaction/update-accountは一緒に結合されなければなりません。そうでなければ、原子性の問題に終わります。 –

+1

2フェーズコミットに関して何も言及していません。データベーストランザクション管理はシンプルであり、2フェーズコミットよりはるかに簡単です。 2PCが必要な場合、Springの@Transactionalはあなたを助けません。 – Nick

2

について(1): 私は、過去数年間に行われたすべてのプロジェクトで@Transactonalをより実用的なソリューションとして見つけました。非常に特殊なケースでは、SpringのAOPを使用して複数のJDBC接続/ TransactionManagerを使用できるようにしなければなりませんでした。なぜなら、@ Transactionは単一のトランザクションマネージャに結びついているからです。

について(2): 混在したシナリオでは、おそらく壊れたコードを見つけるために多くの自動テストを行っています。私はSpringのAbstractTransactionalJUnit4SpringContextTests/AbstractTransactionalTestNGSpringContextTestsを使ってテストを作成します。それはこれまで非常に効果的な解決策でした。

関連する問題