SQLのUPDATEやDELETEで、ある程度の数のレコードを一括更新するとSQLエラー -110 が発生します。
これは InterSystems FAQ サイトの記事です。
通常SQLCODE -110(Locking conflict in filing)のエラーはロックが競合した場合に発生します。
大量レコードが一度に更新された場合、その件数がロック閾値を超えてロックエスカレーションを起こしてテーブルロックとなる可能性があり、そのためにロックの競合が起きやすくなっていることが考えられます。
このロック閾値を上げることにより、この競合を回避できる可能性もあります。
しかしこの閾値を上げることにより、システムが必要とするロック管理用のメモリが増えるという副作用がありますので、慎重な検討が必要です。
あるいはテーブルロックになる可能性を排除できずに、更新タイミング等アプリケーションの仕様を見直す必要があるかもしれません。
またSQLCODE -110はロックテーブルの空き容量が不足した場合にも発生する可能性があります。
コンソールログファイル(※)をご確認いただき、「LOCK TABLE FULL!!!」のエラーが記録されているようであれば、ロックテーブルの容量不足が原因です。
※ InterSystems IRIS のコンソールログファイル名は messages.log、Caché/Ensemble/HealthShare コンソールログファイル名は cconsole.log
この場合は、
- ロックテーブルのサイズを増やす
- ロック閾値を小さくして、より少ない件数でテーブルロックに移行するように設定する
などの対応が考えられます。
各種設定は管理ポータルの以下メニューで行うことができます。
ロックテーブルサイズの設定:
【バージョン2011.1~】
[ホーム] > [システム管理] > [構成] > [追加の設定] > [メモリ詳細設定]
gmheap(KB 単位) と locksiz(バイト単位)
【バージョン2009.1~2010.2】
[ホーム] > [構成] > [メモリ詳細設定]
gmheap(KB 単位) と locksiz(バイト単位)
【バージョン5.1~2008.2】
[ホーム] > [構成] > [詳細設定] カテゴリ:Memory
GenericHeapSize と LockTableSize
ロック閾値の設定:
【バージョン2011.1~】
[ホーム] > [システム管理] > [構成] > [SQL設定] > [一般SQL設定] : ロック閾値
【バージョン2009.1~2010.2】
[ホーム] > [構成] > [SQL設定] > [一般SQL設定] : ロック閾値
【バージョン5.2~2008.2】
[ホーム] > [構成] > [SQL設定] : ロック閾値 【バージョン5.1】
バージョン5.1では、ロック閾値は以下メソッドを使用して変更します。
// 第1引数に指定したい閾値、第2引数は参照渡しで現在の閾値が設定されます。
// 処理が成功すると、1が返ります。
set st=$system.SQL.SetLockThreshold(1001,.oldval)