SET QUERY AND LOCK
SET QUERY AND LOCK ( lock )
引数 | 型 | 説明 | |
---|---|---|---|
lock | Boolean | → | True = クエリで見つけたレコードをロック False = レコードをロックしない |
説明
SET QUERY AND LOCK コマンドを使用して、カレントのトランザクション中でこのコマンドに引き続き呼び出されるすべてのクエリで見つかったレコードを自動的にロックできます。つまりクエリを行ってから結果を処理するまで、他のプロセスはレコードを変更できなくなることを意味します。
デフォルトで、検索されたレコードはロックされません。ロックを有効にするにはlock引数にTrueを渡します。
このコマンドはトランザクションの中で使用しなければなりません。このコマンドがトランザクションの外側で呼び出されると、エラーが生成されます。このコマンドはレコードロックのより良いコントロールを提供します。検索されたレコードはトランザクションが終了 (有効またはキャンセル) するまでロックされたままとなります。トランザクションが終了すると、レコードのロックは解除されます(ただしカレントレコードを除く)。
カレントトランザクション中のすべてのテーブルのレコードがロックされます。
SET QUERY AND LOCK (True) 文が実行されると、(QUERYのような)クエリコマンドは、すでにロックされたレコードを見つけると、特定の動作を選択します:
- クエリが停止され、システム変数OKは0に設定されます,
- カレントセレクションはクリアされます,
- LockedSetシステムセットにはクエリを停止する原因となったロックされたレコードが格納されます。
したがって、カレントセレクションが空だったりOK変数が0だった場合、LockedSetをテストして失敗の原因を検証する必要があります。
このメカニズムを無効にするには、SET QUERY AND LOCK (False) を実行します。
SET QUERY AND LOCK は、下記のクエリコマンドの動作を変更します:
- QUERY
- QUERY SELECTION
- QUERY BY EXAMPLE
- QUERY BY FORMULA
- QUERY BY SQL
- QUERY SELECTION BY FORMULA
- QUERY SELECTION WITH ARRAY
- QUERY WITH ARRAY
- QUERY BY ATTRIBUTE
- QUERY SELECTION BY ATTRIBUTE
これに対してSET QUERY AND LOCK は、ALL RECORDS やRELATE MANY 等、テーブルのカレントセレクションを変更する他のコマンドには影響を与えません。
例題
この例題では、CategoryがCに属する顧客は、QUERYとDELETE SELECTIONの間で、他のプロセスから変更や削除はできません。:
START TRANSACTION
SET QUERY AND LOCK(True)
QUERY([Customers];[Customers]Categorie=“C”)
//At this moment, the records found are automatically locked for all other processes
DELETE SELECTION([Customers])
SET QUERY AND LOCK(False)
VALIDATE TRANSACTION
エラー管理
コマンドがトランザクションのコンテキスト中で呼び出されなかった場合、エラーが生成されます。