1

I'm using Spring with Hibernate. I have some queries that don't actually need a transaction, but I'm using one because it does the session management for me. What is the correct way of doing these non-transactional read queries without doing my own session management?

4

2 に答える 2

4

@Transaction(readOnly=true)正しい方法だと思います。これは、新しい/追加の物理トランザクションを作成するものではないため、それを使用するオーバーヘッドはありません。リクエストに対してすでに設定されているトランザクションを使用します。Hibernate のドキュメントによると:

... 実際、クエリであれ DML であれ、すべての SQL ステートメントはデータベース トランザクション内で実行する必要があります。データベース トランザクション以外では、データベースと通信することはできません。(読み取り専用トランザクションなどがあることに注意してください。これは、データベース エンジンが自身の操作を最適化するほど賢くない場合に、データベース エンジンのクリーンアップ時間を改善するために使用できます。)

https://community.jboss.org/wiki/SessionsAndTransactions#Transactions

于 2012-04-25T22:02:52.007 に答える
1

データベースとのトランザクションなしで作業する方法はありません (まあ、ありますが、ドライバーが DB2 ドライバーのように NO_TRANSACTION モードをサポートするのはまれなケースです)。さらに、ドライバーとデータベースは、読み取り専用トランザクション (Oracle など) をサポートしていない場合があります。したがって、基礎となる接続が読み取り専用モードに設定されていたとしても、それが有効になるわけではありません。

この場合の読み取り専用フラグについて確実な唯一のことは、Hibernate のフラッシュ モードを MANUAL に設定することです。これは、Session#flush() への明示的な呼び出しが発行されない限り、Hibernate がデータベースと同期しないことを意味します。したがって、トランザクションの最後にダーティ チェックや挿入/更新/選択が発行されることはありません。

トランザクション管理のより正確な情報については、org.springframework.orm.hibernate3.HibernateTransactionManager#doBegin()メソッドを参照してください。

于 2012-04-26T05:11:29.387 に答える