CakePHPには楽観的ロックのサポートがないように思われるので、私はそれを実装する動作を構築することに挑戦しています。動作を少し調べた後、beforeSaveイベントでクエリを実行して、バージョンフィールドが変更されていないことを確認できると思います。
ただし、更新ステートメントのWHERE句をから変更してチェックを実装したいと思います。
WHERE id = ?
に
WHERE id = ? and version = ?
このようにして、バージョンを読み取ってから更新を実行するまでの間にデータベースレコードを変更する他の要求について心配する必要はありません。また、2回ではなく1回のデータベース呼び出しを実行できることも意味します。
DboSource.update()
メソッドが条件をサポートしていることがわかりますがModel.save()
、条件を渡すことはありません。
私にはいくつかの選択肢があるようです:
- チェックインを行い、
beforeSave()
防弾ではないという事実を受け入れてください。 - CakePHPのローカルコピーをハックして、の配列
conditions
内のキーをチェックし、それをメソッドに渡します。options
Model.save()
DboSource.update()
現在、私は2番目のオプションに傾倒していますが、それは、他のユーザーが私のハックをフレームワークに適用しない限り、他のユーザーと自分の行動を共有できないことを意味します。
より簡単なオプションを逃したことがありますか?