JPA挿入がデータベーステーブルをロックしないようにするにはどうすればよいですか?
-
05-07-2019 - |
質問
永続層としてHibernateがサポートするJPAを使用しています。 Soap呼び出しからデータを集計し、データベースに行を格納するマルチスレッドプロセスがあります。通常、このプロセスは約700行を挿入し、約1〜3時間かかります。SOAP呼び出しが主なボトルネックになります。
このプロセス全体で、挿入するテーブルがロックされ、selectステートメントがタイムリーに返されません。
SQLサーバーエラーは次のとおりです。
エラーメッセージ:ロックリクエストのタイムアウト期間を超えました。
この時間のかかるプロセス中にデータベーステーブルのロックを回避するにはどうすればよいですか
解決
same トランザクションで700行すべてを挿入しますか?
トランザクションの境界はどこですか?トランザクションの境界を下げることができる場合、つまり、実際の挿入操作のみをトランザクションする場合、ロックは確実に保持されます。
プロセス全体をアトミックにする必要がある場合は、一時テーブルに書き込んでから一括挿入(高速)を実行してメインテーブルに挿入することをお勧めします。
他のヒント
おそらく分離レベルを変更する必要があります。
さまざまな分離レベルと、それらの防御レベルについて説明します。これを行う一般的な方法は、データの整合性/誤読の要件を念頭に置いて、厳格主義者から始めて、より良い応答時間を必要とする場合は低くすることです。
編集
Springトランザクションレベルは、トランザクションマネージャでJDBC(または何でも)トランザクション分離レベルを抽象化するために使用されます。それらは TransactionDefinition で定義されていますa>クラスであり、静的メンバーです。
TransactionDefinition.ISOLATION_DEFAULT
Default isolation
TransactionDefinition.ISOLATION_READ_UNCOMMITTED
Lowest level of isolation; allows transactions to see uncommitted modifications from other transactions
TransactionDefinition.ISOLATION_READ_COMITTED
Cannot read uncommitted data
TransactionDefinition.ISOLATION_REPEATABLE_READ
Ensures repeatable reads
TransactionDefinition.ISOLATION_SERIALIZABLE
Most reliable; all transactions are executed atomically, and are treated as though they occurred serially.
トランザクション伝播レベルもあります。純粋な読み取りにトランザクションを使用している可能性がありますが、これは過剰な場合があります-読み取りにはトランザクションは必要ありません。書き込みには常にトランザクションが必要です。 TransactionDefinitionでも伝播レベルは明確です。これらは、通常はスプリング配線ファイルで使用され、特定の呼び出しのシリアル化と伝播を定義します。配線の例があれば、さらにヒント/情報を提供できるかもしれません。
1つのJPAトランザクションで700件のSOAPリクエストを実行しようとしていますか?しないでください。 :-)