6

MS SQL のテーブルを更新する Java プログラムがあります。このテーブルには、ColdFusion で作成された Web サイトを介して Web ユーザーもアクセスします。

最近、次の行でこのエラーが発生します。

sql_stmt.executeUpdate("update random_selection "
    + "set forecasted = 1 where "
    + " randnum = " + ora_rs.getString("RANDNUM")
    + " and quarter = " + quarter
    + " and ozip3 = " + ora_rs.getString("OZIP3"));

エラーが発生している CF クエリは次のとおりです。

<cfquery name="submit_forecast" datasource="ttmsdropper" username="#request.db_username#" password="#request.db_password#">
    INSERT INTO forecast_entry
    VALUES (<cfqueryparam value="#currentRecord[8]#">)
</cfquery>

このエラーの原因と修正方法を教えてください。

4

2 に答える 2

12

デッドロックは、2 つのプロセスが同時に同じデータにアクセスしようとすると発生します。どちらも同じデータに対する要求を持っています。(説明したように)多くの更新/挿入アクティビティが行われている場合に最も一般的です。DBシステムは、トランザクションの1つを「選択」して「勝者」にします。

場合によっては、インデックス作成によってデッドロックが改善または緩和されることがありますが、それは選択が関係している場合のみです。優れたインデックス作成戦略により、選択のパフォーマンスが向上し、行ロックがより効率的になる可能性があります。ただし、デッドロックが更新と競合する挿入から発生している場合、インデックス作成は役に立ちません。データの挿入または更新に合わせてインデックスを更新する必要があるため、積極的なインデックス作成は状況を悪化させる可能性があります。

それを解決する方法は、システムと何をしようとしているのかによって大きく異なります。挿入/更新のロックを最小限に抑えるか、何らかの方法でより多くのリソースまたはより高速なリソースを提供する必要があります。挿入をまとめてバッチ処理する、proc または RAM を増やす (場合によっては常にではありません)、クラスタリング、テーブルとデータを分割する、並列処理を微調整する - これらはすべて実行可能なオプションです。そして、厳格なルールはありません。

于 2012-06-06T15:12:48.550 に答える
1

テーブルへの更新がまったくない場合 (挿入のみ)、選択を変更してみてください。

マークが言ったように、これは ColdFusion ではなく DB エラーであり、ロックが発生しています。複雑な選択と更新がある場合は、句の列にインデックスを追加してください。

于 2012-06-06T22:19:33.367 に答える