メインコンテンツまでスキップ
バージョン: v20 R4 BETA

$lock

ペシミスティック・ロック機構 を使ってエンティティをロック/アンロックします。

シンタックス

他のセッションや 4Dプロセスに対し、特定のエンティティをロックするには:

/?$lock=true

他のセッションや 4Dプロセスに対し、特定のエンティティをアンロックするには:

/?$lock=false

lockKindText プロパティ は "Locked by session" です。

説明

REST API によるロックは、セッション レベルで設定されます。

ロック されたエンティティは次のものから操作 (ロック / アンロック / 更新 / 削除) できません:

  • 他の REST セッション
  • RESTサーバー上で実行されている 4D プロセス (クライアント/サーバー, リモートデータストア, スタンドアロン)。

REST API によってロックされたエンティティは、次の場合にのみアンロックされます:

  • ロック元の (/?$lock=true をおこなった) RESTセッションが /?$lock=false をリクエストしたとき。
  • ロック元セッションの 非アクティブタイムアウト に達したとき (セッションは閉じられます)。

レスポンス

?$lock リクエストでロック操作に成功した場合、"result"=true を格納した JSONオブジェクトが返されます (失敗した場合は "result"=false)。

戻り値の "__STATUS" オブジェクトには、以下のプロパティが格納されています:

プロパティタイプ説明
成功の場合にのみ利用可能:
successbooleanロックに成功した場合 (あるいはエンティティがすでにカレントセッションでロックされていた場合) には true、それ以外は false (この場合は返されません)。
エラーの場合にのみ利用可能:
statusnumberエラーコード、以下参照
statusTexttextエラーの詳細、以下参照
lockKindnumberロックコード
lockKindTexttext"Locked by session" RESTセッションによるロック、"Locked by record" 4Dプロセスによるロック
lockInfoobjectロック元についての情報。 返されるプロパティはロック元 (4Dプロセスまたは RESTセッション) によって異なります。
4Dプロセスによるロックの場合:
task_idnumberプロセスID
user_nametextマシン上でのセッションユーザー名
user4d_aliastext4D ユーザーの名前またはエイリアス
user4d_idnumber4DデータベースディレクトリでのユーザーID
host_nametextマシン名
task_nametextプロセス名
client_versiontextクライアントのバージョン
RESTセッションによるロックの場合:
hosttextエンティティをロックした URL (例: "127.0.0.1:8043")
IPAddrtextロック元の IPアドレス (例: "127.0.0.1")
recordNumbernumberロックされたレコードのレコード番号
userAgenttextロック元の userAgent (例: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36")

エラー時には __STATUS オブジェクトの status および statusText プロパティに以下のいずれかの値が返されます:

statusstatusText説明
2"Stamp has changed"エンティティの内部的なスタンプ値がデータ内に保存されているエンティティのものと合致しません (オプティミスティック・ロック)。
3"Already locked"エンティティはペシミスティック・ロックでロックされています。
4"Other error"深刻なエラーとは、低レベルのデータベースエラー (例: 重複キー)、ハードウェアエラーなどです。
5"Entity does not exist anymore"エンティティはもうデータ内に存在していません。

例題

一つ目のブラウザーからエンティティをロックします:

GET /rest/Customers(1)/?$lock=true

レスポンス:

{
"result": true,
"__STATUS": {
"success": true
}
}

二つ目のブラウザー (別のセッション) から、同じリクエストを送信します:

レスポンス:

{
"result":false,
"__STATUS":{
"status":3,
"statusText":"Already Locked",
"lockKind":7,
"lockKindText":"Locked By Session",
"lockInfo":{
"host":"127.0.0.1:8043",
"IPAddr":"127.0.0.1",
"recordNumber": 7,
"userAgent": ""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36..."
}
}
}