これは InterSystems FAQ サイトの記事です。
通常SQLCODE -114(一致する行が既に別のユーザにロックされています)のエラーはロックが競合した場合に発生します。
こちらはレコードロック競合があったり、ロック閾値を超える更新を行いテーブルロックに昇格した際に、そのテーブルレコードに対して別のプロセスよりSelectを行い共有ロックを取ろうとして失敗した(ロック待ちがタイムアウトとなった)場合に発生します。
Selectで共有ロックを取る場合というのは、IRIS の ISOLATION LEVEL がREAD COMMITTED(デフォルトはREAD UNCOMMITTED)で、Selectを行った場合です。
例:Sample.Personテーブルにテーブルロックがかかった状態で以下を実行する場合
USER>:sql
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>set transaction isolation level read committed // Read Committed セット
:
[SQL]USER>>select Name from Sample.Person where Age < 10
2. select Name from Sample.Person where Age < 10
Name
[SQLCODE: <-114>:<ひとつまたはそれ以上のマッチする行が別のユーザによりロックされています>]
[%msg: <Unable to acquire shared lock on table Sample.Person for RowID value: 4>]
0 Rows(s) Affected
こちらは、
- 他のプロセスが該当テーブルの該当IDをロックしている
- ロック閾値によるテーブルロックを行っている
- システムのロックテーブルが不足しているためのロックテーブルフル状態
のいずれかになっているものと考えられます。
ロックテーブルフルの場合、messages.log に「LOCK TABLE FULL!!!」のエラーが記録されます。
ロックテーブルフルの場合にロックテーブルサイズを変更する方法は、2023.1 より前のバージョンの場合は こちらの記事 をご覧ください。
2023.1以降のバージョンでは、ロックテーブルサイズは既定で 0 に設定されています。
0 の場合は、構成されたグローバルバッファサイズ(データベースキャッシュサイズ)に基づき、最も効果的な設定値が自動構成されます。
【ご参考】
SQLのUPDATEやDELETEで、ある程度の数のレコードを一括更新するとSQLエラー -110 が発生します