JPA挿入がデータベーステーブルをロックしないようにするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1208936

質問

永続層としてHibernateがサポートするJPAを使用しています。 Soap呼び出しからデータを集計し、データベースに行を格納するマルチスレッドプロセスがあります。通常、このプロセスは約700行を挿入し、約1〜3時間かかります。SOAP呼び出しが主なボトルネックになります。

このプロセス全体で、挿入するテーブルがロックされ、selectステートメントがタイムリーに返されません。

SQLサーバーエラーは次のとおりです。

  

エラーメッセージ:ロックリクエストのタイムアウト期間を超えました。

この時間のかかるプロセス中にデータベーステーブルのロックを回避するにはどうすればよいですか

役に立ちましたか?

解決

same トランザクションで700行すべてを挿入しますか?

トランザクションの境界はどこですか?トランザクションの境界を下げることができる場合、つまり、実際の挿入操作のみをトランザクションする場合、ロックは確実に保持されます。

プロセス全体をアトミックにする必要がある場合は、一時テーブルに書き込んでから一括挿入(高速)を実行してメインテーブルに挿入することをお勧めします。

他のヒント

おそらく分離レベルを変更する必要があります。

情報は次のとおりです。 http://www.interview-questions-tips-forum.net/index.php/Your-Questions-on-Java/JDBC-Transaction/Transaction-Isolation-Levels

さまざまな分離レベルと、それらの防御レベルについて説明します。これを行う一般的な方法は、データの整合性/誤読の要件を念頭に置いて、厳格主義者から始めて、より良い応答時間を必要とする場合は低くすることです。

編集

Springトランザクションレベルは、トランザクションマネージャでJDBC(または何でも)トランザクション分離レベルを抽象化するために使用されます。それらは TransactionDefinition クラスであり、静的メンバーです。

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リクエストを実行しようとしていますか?しないでください。 :-)

scroll top