楽観ロック対処レシピ
楽観ロック 競合 (exit 6) が発生したときの実践パターン集です。
競合が起きる仕組み
page edit は送信前に取得した commitId とサーバ側の最新 commitId を比較します。
別ユーザーまたは別エージェントが先に編集していると commitId がずれて exit 6 になります。
パターン1: 最新 commitId を取得して再実行
最もシンプルな対処法です。
code:bash
# 最新の commitId を取得
COMMIT=$(cos page get "タイトル" --project myproject --json --results-only --select 'commitId')
# 再実行
cos page edit "タイトル" --from-file ./content.txt --expect-commit "$COMMIT" --project myproject
パターン2: リトライループ
競合が頻繁に起きる環境向けです。
code:bash
attempt=0
while $attempt -lt 3 ; do
COMMIT=$(cos page get "タイトル" --project myproject --json --results-only --select 'commitId')
if cos page edit "タイトル" --from-file ./content.txt --expect-commit "$COMMIT" --project myproject; then
break
fi
attempt=$((attempt + 1))
sleep 1
done
パターン3: 行編集で競合リスクを下げる
変更箇所が少ない場合は page line replace / page line delete を使うと競合確率が大幅に下がります。
code:bash
# 全体を書き換える代わりに該当行だけ置換
cos page line replace "タイトル" --line 5 --text "新しいテキスト" --project myproject
パターン4: sync push の競合対処
sync push が exit 6 になった場合は pull してから再 push します。
code:bash
# 最新版を取得
cos sync pull "タイトル" --dir ./sync --project myproject
# 内容を確認・マージ後に再 push
cos sync push "タイトル" --dir ./sync --project myproject
パターン5: --force で強制上書き (非推奨)
他者の編集が失われる可能性があるため、原則使わないでください。
code:bash
cos page edit "タイトル" --from-file ./content.txt --force --project myproject
どのパターンを選ぶか
変更が局所的 → パターン3 (page line replace) を最優先
変更が広範囲 → パターン1 または パターン2
sync 操作 → パターン4
--force はデバッグや緊急時のみ
関連ページ
楽観ロック
page edit
page line replace
sync push
終了コード
AI エージェント向け運用ガイド
#agent #reference