2009-10-31 4 views
5

私は、Springでのトランザクションの伝播がHibernateと実際は混乱しています。私はSpringの@Transactionalアノテーションを私のサービスレイヤメソッドで使用しています。いくつかは「読み取り専用=真」とマークされています。私の読み取り専用サービスメソッドの1つが読み取り専用ではないメソッドを呼び出す場合、どうすれば対処できますか?Open Session In Viewを使用すると、トランザクションの伝播はどのように機能しますか?

REQUIRES_NEWの伝播をサポートするために私のすべての読み書き方法をマークすることができますが、これは望ましくないかもしれないという振る舞いをもたらします。つまり、読み取り専用メソッドが読み書き方法と呼ばれています。 read-writeメソッドが別のread-writeメソッドを呼び出すと、新しいトランザクションは必要ありません。

これをすべて考慮して、Open Session In View(OSIV)の仕組みがわかりません!確かに、SpringでOSIVを使用すると、OpenSessionInViewFilterは、サービスメソッドが呼び出される前にトランザクションを開始する必要があります。その場合、トランザクションが読み取り専用か読み取り書き込みかを定義する必要があります。しかし、どうやってこれを知ることができますか?サービス層のカバーの下で何が起こるかはわかりません。

私はこのすべてのことで完全に暗いですし、誰かにそれを私に説明するのが大好きです!

答えて

2

Open Session In Viewでは、リクエスト全体が1つのトランザクション内で発生する必要はありません。つまり、Hibernateセッションは要求を処理するスレッドにバインドされ、何かがセッションを要求するたびに再利用される要求。 Sessionは、スコープ内にマップされているすべてのオブジェクトのアイデンティティーを維持するファンシーマップのようなもので、実際のオブジェクトは1つのトランザクションまたは複数のトランザクションでフェッチできます。

トランザクションあたりのセッションのパターンは、実際にはの代替語句からOSIVです。このパターンは頻繁に遭遇することはありません。

読み取り専用メソッドの呼び出し時には、実際にデータを書き込むことができるときにこの読み取り専用を検討する理由を再考する必要があります。私は、あなたが読み取り専用部分を除外し、読み取り専用メソッドを呼び出して読み書きメソッドを呼び出すか、読み込み専用メソッドを呼び出すことをやめることを主張します。

トランザクションが1つのトランザクションで読み取り専用モードに設定されているため、残りのセッション(OSIV)で読み取り専用モードのままであるとは限りません。実際、オープンセッションの範囲内にある後続のトランザクションは、同じ接続上でさえも起こらないことがあります。

2

読み取り専用トランザクションメソッドから読み書きトランザクションメソッドを呼び出すと、読み取り専用ステータスも伝播します。私。トランザクション全体が読み取り専用になります。トランザクションは実際には読み書き可能であるため、呼び出しメソッドを読み書き可能に変更したいと思うかもしれません。

また、REQUIRES_NEW伝播を使用できますが、その場合、Springは新しいトランザクションの存続期間中に別のセッションを作成します。新しい取引が本当に必要な場合にのみ使用してください。

Hibernateセッションには、いくつかの順次トランザクションが含まれる場合があります。したがって、OSIVフィルタは、どのような種類のトランザクションが含まれるかを知る必要はありません。 OSIVフィルタはFlushMode = MANUALでセッションを作成し、読み書きトランザクションのメソッドはこれを一時的にFlushMode = AUTOに変更します。各トランザクションは、読み取り専用JDBC接続または読み書きJDBC接続を使用します。

6

Hibernateセッションのライフサイクルは、トランザクションのライフサイクルと異なります。 2つは互いに重なり合うことができる。

OpenSessionInViewFilterの場合、これはトランザクションとまったく関係なく、リクエスト中にHibernateセッションのライフサイクルを管理するだけです。 Springトランザクションメソッドが呼び出されると、新しいトランザクションが開始され、Hibernateセッションに関連付けられ、メソッドが終了するとコミット/ロールバックされます。要求が終了すると、セッションはフィルタによって閉じられます。セッションと同時にトランザクションを開始/終了する必要はありません。

お客様のread-only取引に関する質問(これはまったく別の問題ですが、偶然)、これは基本的なデータベースに対するヒント以上のもので、データが変更されないことを意味します。私はこれには具体的な効果は見られませんでしたが、ドキュメントツールとしては他のものよりも便利だと思われます。

関連する問題