ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com

ホーム

 
4D v19.8
entity.lock( )

entity.lock( ) 


 

entity.lock ( {mode} ) -> 戻り値 
引数   説明
mode  倍長整数 in dk reload if stamp changed: スタンプが変更されていた場合にはロックする前にリロード
戻り値  オブジェクト in ロックオペレーションの結果

説明   

entity.lock( ) メソッドはデータクラスにリレートされたデータストアとテーブル内のエンティティに合致するレコードにペシミスティック・ロック(*)をかけます。ロックはレコードと、カレントプロセス内でのエンティティの全ての参照に対してかけられます。

(*)詳細な情報については、エンティティロッキング のページを参照してください。

他のプロセスからはこのレコードはロックされて見えます(このメソッドを使って同じエンティティをロックしようとした場合、result.success プロパティにはfalseが返されます)。"locking"セッション内で実行されたメソッドのみがこのエンティティの属性を編集・保存できます。エンティティは他のセッションによって読み込みのみでロードすることもできますが、値の入力・保存はできません。

ロックされたレコードは、以下の場合にロックが解除されます:

  • 同じプロセス内で合致するエンティティに対してunlock() メソッドが呼び出された場合
  • メモリ内からどのエンティティからも参照されなくなった場合、自動的にロックが解除されます。例えば、エンティティのローカル参照に対してのみロックがかかっていた場合、メソッドが終了すればエンティティのロックは解除されます。メモリ内にエンティティへの参照がある限り、レコードはロックされたままです。
  • 合致するエンティティがトランザクション内でロックされ、そのトランザクションが評価されるかキャンセルされれば、自動的にロックが解除されます。

mode 引数が省略された場合、デフォルトで、同じエンティティが他のプロセスあるいはユーザーから同時に変更された(例: スタンプが変更された)場合、メソッドはエラーを返します(以下参照)。
あるいは、mode 引数にはdk reload if stamp changed オプションを渡すことができます。この場合、スタンプが変更された場合でもエラーは返されず、エンティティは再読み込みされます(エンティティが引き続き存在し、プライマリーキーが引き続き同じであった場合)。

結果オブジェクト

entity.lock( ) によって返されたオブジェクトには、以下のプロパティが含まれます:

プロパティ詳細
successブールロックアクションが成功した場合(あるいはエンティティがすでにカレントプロセスでロックされていた場合)にはtrue、それ以外の場合にはfalse
dk reload if stamp changed オプションが使用されていた場合にのみ利用可能:
wasReloadedブールエンティティのリロードが成功した場合にはtrue、それ以外の場合にはfalse
エラーの場合にのみ利用可能:
status(*)数値エラーコード、以下参照
statusText(*)テキストエラーの詳細、以下参照
ペシミスティック・ロックエラーの場合にのみ利用可能:
lockKindTextテキスト"Locked by record"
lockInfoobjectロックの元についての情報
task_id数値プロセスID
user_nameテキストマシン上でのセッションユーザー名
user4d_aliasテキスト4D ユーザーの名前またはエイリアス
user4d_id数値4DデータベースディレクトリでのユーザーID
host_nameテキストマシン名
task_nameテキストプロセス名
client_versionテキスト
深刻なエラーの場合にのみ利用可能(深刻なエラーとは、プライマリーキーを重複させようとした、ディスクがいっぱいであった、などです):
errorsオブジェクトのコレクション
messageテキストエラーメッセージ
component signatureテキスト内部コンポーネント署名(例 "dmbg" はデータベースコンポーネントを表します)
errCode数値エラーコード

(*) エラー時にはResult オブジェクトのstatus あるいは statusText プロパティに以下のいずれかの値が返されます:

定数 コメント
dk status entity does not exist anymore 5 エンティティはもうデータ内に存在していません。このエラーは以下のような場合に起き得ます:
  • エンティティがドロップされている(スタンプは変更されていて、メモリ空間は解放されている)
  • エンテイィ亭はドロップされていて、他のプライマリーキー値を持っているもので置き換えられている(スタンプは変更されていて、新しいエンティティがメモリ空間を使用している)。entity.drop( )を使用している場合、このエラーはdk force drop if stamp changed オプションを使用した場合に返される場合があります。entity.lock( )を使用している場合、このエラーはdk reload if stamp changed オプションを使用した場合に返される場合があります。

割り当てられたstatusText: "エンティティはもう存在しません"

dk status locked 3 エンティティはペシミスティック・ロックでロックされています。
割り当てられたstatusText: "既にロックされています"
dk status serious error 4 深刻なエラーとは低レベルのデータベースエラー(例:重複キーなど)、ハードウェアエラーなどです。
割り当てられたstatusText: "その他のエラー"
dk status stamp has changed 2 エンティティの内部的なスタンプ値がデータ内に保存されているエンティティのものと合致しません(オプティミスティック・ロック)。
  • entity.save( ) の場合: dk auto merge オプションが使用されていない場合に限りエラー
  • entity.drop( ) の場合: dk force drop if stamp changed オプションが使用されていない場合に限りエラー
  • entity.lock( ) の場合: dk reload if stamp changed オプションが使用されていない場合に限りエラー
割り当てられたstatusText: "スタンプが変更されています"

エラーのある例題:

 C_OBJECT($employee;$status)
 $employee:=ds.Employee.get(716)
 $status:=$employee.lock()
 Case of
    :($status.success)
       ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
    :($status.status=dk status stamp has changed)
       ALERT($status.statusText)
 End case

dk reload if stamp changed オプションを使用した場合を考えます:

 C_OBJECT($employee;$status)
 
 $employee:=ds.Employee.get(717)
 $status:=$employee.lock(dk reload if stamp changed)
 Case of
    :($status.success)
       ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
    :($status.status=dk status entity does not exist anymore)
       ALERT($status.statusText)
 End case



参照 

entity.unlock( )

 
プロパティ 

プロダクト: 4D
テーマ: ORDA - エンティティ

 
ページの目次 
 
履歴 

初出: 4D v17

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v19)
ランゲージリファレンス ( 4D v19.1)
ランゲージリファレンス ( 4D v19.4)
ランゲージリファレンス ( 4D v19.5)
ランゲージリファレンス ( 4D v19.6)
ランゲージリファレンス ( 4D v19.7)
ランゲージリファレンス ( 4D v19.8)