SQLのUPDATEやDELETEで、ある程度の数のレコードを一括更新するとSQLエラー -110 が発生します。

通常SQLCODE -110(Locking conflict in filing)のエラーはロックが競合した場合に発生します。

大量レコードが一度に更新された場合、その件数がロック閾値を超えてロックエスカレーションを起こしてテーブルロックとなる可能性があり、そのためにロックの競合が起きやすくなっていることが考えられます。

このロック閾値を上げることにより、この競合を回避できる可能性もあります。

しかしこの閾値を上げることにより、システムが必要とするロック管理用のメモリが増えるという副作用がありますので、慎重な検討が必要です。

あるいはテーブルロックになる可能性を排除できずに、更新タイミング等アプリケーションの仕様を見直す必要があるかもしれません。

またSQLCODE -110はロックテーブルの空き容量が不足した場合にも発生する可能性があります。

コンソールログファイル(※)をご確認いただき、「LOCK TABLE FULL!!!」のエラーが記録されているようであれば、ロックテーブルの容量不足が原因です。

※ InterSystems IRIS のコンソールログファイル名は messages.log、Caché/Ensemble/HealthShare コンソールログファイル名は cconsole.log

この場合は、

などの対応が考えられます。

各種設定は管理ポータルの以下メニューで行うことができます。

ロックテーブルサイズの設定:
【InterSytsems IRIS /Caché2011.1~】
 [ホーム] > [システム管理] > [構成] > [追加の設定] > [メモリ詳細設定]
 gmheap(KB 単位) と locksiz(バイト単位)

ロックサイズの設定
【Caché2009.1~2010.2】
 [ホーム] > [構成] > [メモリ詳細設定]
 gmheap(KB 単位) と locksiz(バイト単位)
【Caché5.1~2008.2】 
 [ホーム] > [構成] > [詳細設定] カテゴリ:Memory
 GenericHeapSize と LockTableSize

ロック閾値の設定:
【InterSystems IRIS/Caché2011.1~】
 [ホーム] > [システム管理] > [構成] > [SQL設定] > [一般SQL設定] : ロック閾値

ロック閾値の設定

【Caché2009.1~2010.2】
 [ホーム] > [構成] > [SQL設定] > [一般SQL設定] : ロック閾値
【Caché5.2~2008.2】
 [ホーム] > [構成] > [SQL設定] : ロック閾値

【Caché5.1】
Caché5.1では、ロック閾値は以下メソッドを使用して変更します。

// 第1引数に指定したい閾値、第2引数は参照渡しで現在の閾値が設定されます。
// 処理が成功すると、1が返ります。
set st=$system.SQL.SetLockThreshold(1001,.oldval)

該当する製品: Caché, Ensemble, HealthShare/Caché Based, IRIS Data Platform, HealthShare/IRIS Based, IRIS for Health
関連トピック: アプリケーションでロックタイムアウトエラーが発生します。
添付ファイル:

アンケートにご協力をお願いします
このトピックは参考になりましたか?
このトピックに関するお問い合わせ

FAQトップに戻る