0

データベースのトランザクションが開始された場合、開始されたトランザクションがコミットまたはロールバックされるまで、読み取り操作と更新操作を許可しないというシナリオがあります。

例: 行を挿入しようとすると、データベース内の既存の行に対していくつかの特定の変更を行う必要があります。変更が完了する前に他のトランザクションまたはデータベース クエリがデータを読み取ると、最終的には次のようになります。データベースの値が悪いため、クエリを制御する方法。

私が正確にやりたいことは、トランザクションが開始されるたびに、データベースにロックをかけたいということです。これを行う方法は?

Hibernate トランザクション (宣言型トランザクション) @Transactional(readOnly=false,propagation=Propagation.REQUIRES_NEW) を使用していますが、要件を満たすトランザクションに他の属性を追加できますか。

4

1 に答える 1

0

あなたはそれをする必要はありません。トランザクションは互いに独立して実行されます。デフォルトの分離レベル (ほとんどの場合、READ_COMMITTED) では、各トランザクションは、他のトランザクションが既にコミットしたものしか認識しません。したがって、トランザクションの実行中にデータベースから読み取る並列トランザクションが 1 つある場合、この並列トランザクションは、コミットされるまでメイン トランザクションの変更を認識しません。各トランザクションには、データベースの一貫したスナップショットが表示されます。

ほとんどの場合、これで十分です。十分でない場合は、より高い分離レベル (データベースでサポートされている場合は REPEATABLE_READ や SERIALIZABLE など) を使用することもできますが、データベースを完全にロックすることは不可能であり、望ましくありません。

各分離レベルが保証する内容の詳細については、http://en.wikipedia.org/wiki/Isolation_%28database_systems%29を参照してください。また、データベースのドキュメントを参照して、サポートされているレベルを確認してください。

補足: @Transactional は Spring アノテーションであり、Hibernate アノテーションではありません。

于 2012-06-28T07:22:11.887 に答える