2011-01-11 10 views
0

私は現在、Hibernateとtomcat(JBossなし)のみを使用していますが、実際に使用しているトランザクションの安全性レベル、特に値を読み取り、取得してから更新する)。だから私は汚い読みを得るかもしれない?hibernateトランザクションの安全性(with、with JBoss)

だから、汚れのない読み込みが必要なトランザクションを調べて、(1)休止状態でトランザクションのトランザクション安全レベルを適切に制御し、(2)汚い読み込みが問題ないトランザクション

トランザクション安全レベルを制御するために、JBossでHibernateをインストールする必要がありますか?もしそうなら、現在私が基本的なHibernate APIを使用しているので、J2EE APIを使用するアプリケーションを劇的に変更することなく、これを行う最も簡単な方法は何でしょうか。それとも、JBossを使わずにHibernateでJTAコントロールを取得できますか?

アンディ

答えて

0

明示的にem.getTransaction()。begin()およびcommit()を使用してトランザクションをマーキングしていますか?そうであれば、Hibernateはトランザクション管理をJDBCドライバに委譲し、他のプロパティ(ドライバレベルと分離レベルのようなHibernateレベルの両方)で設定することができます。

アプリケーションサーバーを使用する場合は、プロパティhibernate.transaction.factory_classをorg.hibernate.transaction.JTATransactionFactoryに設定するだけで、Hibernateはユーザーの指示に基づいてトランザクションを結合/作成します(em.getTransaction() ).begin()/ commit())。

JTAは、2つ以上の「トランザクション対応」コンポーネントを持っている場合に特に便利です。JTAはイベントをオーケストレーションし、全体的な結果に応じてコミット/ロールバックを調整します。たとえば、データベースに何かを残して電子メールを送信する1つのEJBトランザクションがある場合、両方のアクションをトランザクション内に入れることができ、いずれかが失敗した場合にロールバックすることができます。しかし、のみデータベーストランザクションで興味があれば、本当にJTAは必要ありません。

最後の質問に答えてください:JTAが必要だがEEアプリケーションサーバーを使用したくない場合は、JOTMのようなスタンドアロンのJTAプロバイダを探すことができます。しかし、注意してください:異なるサービスのためにいくつかの "スタンドアロン"プロバイダを追加する場合は、 "家で作られたEEサーバー"で終わるかもしれません;-)良いことではありません;-)

+0

私はHibernatesの開始とコミットを使用しています。しかし、私の主な関心事は、不正な読み込みを防ぐことです。読み取りしようとしているときに別のトランザクションが古い値を参照しないように、読み取りBean内のデータを変更した後でsession.flush()を呼び出す必要があるのでしょうか?つまり、Beanを読み取り、その値を条件付きで変更し、データがコミットまたはロールバックされるまで、同じBeanを読み取る他のトランザクションがブロックされることを期待するトランザクションが多数あります。 –

0

これはtransaction isolation levelsとして知られており、以下の休止状態に

hibernate.connection.isolationをそれらを設定する方法です - JDBCトランザクション分離レベルを設定しますが。 java.sql.Connectionを の意味のある値でチェックしてください。ただし、ほとんどの データベースはすべての分離をサポートしていません。 レベル。例えば。 1、2、4、8