他のユーザによる処理との競合のため、処理がキャンセルされる

設計 操作 エラーメッセージ

質問

マネージャーにてフォームを修正し、保存ボタン押下時に下記メッセージが表示されました。

エラーメッセージ内容

競合
他のユーザによる処理との競合のため、処理はキャンセルされました。
多数の処理要求が重なっているか、長時間かかる処理を管理者が実行している可能性があります。
しばらく待って再実行してください。

サーバの CPU 使用率が、90 ~ 100 % と高負荷であったため、サーバを再起動の上、再度フォームを修正し、保存したところ同じメッセージが表示されました。
他のユーザの [Excel-Link] の処理にも影響が生じており、サーバ再起動をしてもDBがロックされているように思います。

ロック状態となる原因と解決方法を教えてください。

回答

(A-1) 「フォームによるドキュメント取得」(ブラウザから実行)の直後に
(A-2) 「フォームリスト更新」(マネージャから実行)が連続して行われたため、文字どおりの競合が発生したものと思われます。

ここで「他のユーザ」というのは、[ブラウザ][マネージャ] などの 別モジュールによる同一ユーザ の場合も含まれます。 以下はログ該当部分の抜粋です。

ログ (A)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(A-1)  "INFO","リクエストの処理を開始しました。リクエスト:フォームによるドキュメント取得
(A-2)  "INFO","リクエストの処理を開始しました。リクエスト:フォームリスト更新
(A-3)  "INFO","競合によりキャンセルされた処理をリトライしています。1 回目。"
(A-4)  "INFO","競合によりキャンセルされた処理をリトライしています。2 回目。"
(A-5)  "INFO","競合によりキャンセルされた処理をリトライしています。3 回目。"
(A-6)  "INFO","競合によりキャンセルされた処理をリトライしています。4 回目。"
(A-7)  "INFO","競合によりキャンセルされた処理をリトライしています。5 回目。"
(A-8)  "ERROR","他のユーザによる処理との競合のため、処理はキャンセルされました。
多数の処理要求が重なっているか、長時間かかる処理を管理者が実行している可能性があります。
しばらく待って再実行してください。"
(A-9)  "INFO","リクエストの処理を終了しました。実行時間:199000ミリ秒(内、待ち時間:0ミリ秒), リクエスト:フォームリスト更新
(A-10) "INFO","リクエストの処理がキャンセルされました。リクエスト:フォームリスト更新
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ログ (A) の場合は、(A-1)「フォームによるドキュメント取得」中に (A-2)「フォームリスト更新」が実行されたため、競合となったと考えられます。

ログ (B)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(B-1) "INFO","リクエストの処理を開始しました。リクエスト:フォームによるドキュメント取得
(B-2) "INFO","リクエストの処理を終了しました。実行時間:15ミリ秒(内、待ち時間:16ミリ秒), リクエスト:フォームによるドキュメント取得
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ログ (B) によると、(B-2) 「フォームによるドキュメント取得」が正常終了している場合の処理時間は 15 ミリ秒となっておりますが、
ログ (A) にはログ (B-2) に該当する「フォームによるドキュメント取得」が終了した記録がありません。これはアプリケーションサーバーの停止によるものと思われます。
また、アプリケーションサーバーを再起動すると、DBのロック状態は解消されます。このようなロック状態が再起動をまたがることはありません。

再起動後に再度同様のリクエストのパターンが発生したことが原因で、ロック解消後に再びロックがかかり、再起動しても DB がロックされているように見えます。

解決方法

今回のようなフォーム更新時の競合エラーを避ける目的であれば、運用中のフォームが含まれるフォームリストと開発中で頻繁に更新されるフォームが含まれるフォームリストを分けることが挙げられます。

fusion_place 6.1.0 から、すべてのサーバー側処理がタイムアウト(デフォルト 600 秒)の対象となりました
そのため、長くかかるサーバー側の処理を正常に(タイムアウトとして)終了させることができ、後続の処理が競合エラーとなることがこれまでよりも少なくなります。
もし、古いバージョンをお使いであれば、この機会にアップデートをご検討ください。