11

プロジェクトのアップグレード ここでトランザクションについて考えています。問題は、Spring で Hibernate クエリにいつトランザクションを使用する必要がある
かよくわかりません。 トランザクションとは何かを完全に理解していないわけではありませんが、おそらく理解していると思いますが、属性を設定するだけのタイプクエリにトランザクションを使用する必要がありますか?

get*read-only

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- all methods starting with 'get' are read-only -->
        <tx:method name="get*" read-only="true" />
        <!-- other methods use the default transaction settings -->
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>

get*それはクエリにとって効率的ですか?
私が考える限り、トランザクションの使用はCREATE、 、UPDATEDELETEおよびそのようなクエリのように行う必要があるためです。
ここで何か不足していますか?

4

4 に答える 4

12

トランザクションの使用は、要件によって多少異なります。

明らかに、UPDATE 操作と DELETE 操作でトランザクションを使用することは理にかなっています。SELECT ステートメントでトランザクションを使用すると、たとえば、別のスレッド/リクエストが読み取りを変更しないようにレコードをロックする必要がある場合にも役立ちます。これは通常、ビジネス要件です。

当社では、すべてのステートメント (つまり、SELECT、UPDATE、DELETE) をトランザクションにラップします。

さらに、トランザクション管理は、データ レベルに加えて別のレイヤーに適しています。通常、トランザクションはビジネス要件に一致します。たとえば、要件がアカウントにお金を入金することである場合、その特定のメソッドは 1 つのユニットとして完了する必要があるため (複数のデータベースが存在する可能性が高いため)、メソッド全体をトランザクションとしてマークするために、いくつかの高レベルのクラス/コードを使用する必要があります。呼び出します)。

Spring は、トランザクション管理について多くのことを述べています。

于 2011-05-13T15:18:41.633 に答える
3

適切なルールは、DAO より上位のアプリケーション レベルでトランザクションを管理することです。このように、独自のトランザクションで実行する必要があり、既存のトランザクションに参加する必要があるデータ アクセス操作 A がある場合、フープを飛び越える必要はありません。このアプローチを AOP を介したトランザクション (および Hibernate セッション) の管理と組み合わせて、コードがより理解しやすく保守しやすくなるのを観察してください。

于 2011-05-13T16:31:49.840 に答える
2

これは、なぜそうすべきかについてのかなりまともな答えのようです。ただし、これにはいくつかの理由があります。基本的には、修正が完了していない場合にデータが悪い状態になる可能性がある場合に使用します。

于 2011-05-13T15:14:08.430 に答える
0

ゲッターに関する特定の質問に答えるには:

readOnly true で AOP トランザクションを使用し、JPAダイアレクトを適切に休止状態に設定すると、Spring は休止状態セッションを非フラッシュ モードにします。これにより、不必要なダーティ チェックを排除することで、大量の操作のパフォーマンスを大幅に向上させることができます。したがって、その点で価値があります。

于 2011-05-13T17:00:47.427 に答える