楽観ロック
coscli の書き込みコマンド (cos page edit 等) はデフォルトで楽観ロックが有効です。 他のユーザー (または別のエージェント) が同時編集したことを検知して競合を防ぎます。
楽観ロックの仕組み
cos page edit は内部で Cosense の commitId を比較します。
操作前に取得した commitId とサーバ側の最新 commitId が一致しない場合、別の編集が入ったと判断して処理を中断します。
競合時: exit 6 (終了コード)、stderr に CommitConflictError --expect-commit (推奨)
事前に取得した commitId を明示指定します。不一致なら即 exit 6 で停止します。
code:bash
# 1. 現在の commitId を取得
COMMIT=$(cos page get "タイトル" --project myproject --json --results-only --select 'commitId')
# 2. dry-run で確認
cos page edit "タイトル" --from-file ./content.txt --expect-commit "$COMMIT" --project myproject --dry-run
# 3. 本実行
cos page edit "タイトル" --from-file ./content.txt --expect-commit "$COMMIT" --project myproject
競合時のリトライパターン
code:bash
COMMIT=$(cos page get "タイトル" --project myproject --json --results-only --select 'commitId')
cos page edit "タイトル" --from-file ./content.txt --expect-commit "$COMMIT" --project myproject && break
attempt=$((attempt + 1))
sleep 1
done
--force: 楽観ロックを無効化
--force を指定すると競合チェックをスキップして強制上書きします。
⚠️ 他者の編集が失われる可能性があるため、原則 --expect-commit を使ってください。
code:bash
cos page edit "タイトル" --from-file ./content.txt --force --project myproject
cos page line replace / delete との関係
cos page line replace と cos page line delete は楽観ロック (--expect-commit / --force) に未対応です (v0.5.0)。
変更範囲を局所化することで競合確率を下げる運用が推奨されます。
競合のリスクが高い場合は cos page edit --expect-commit でページ全体を入れ替える運用を選んでください。
cos sync push との関係
cos sync push は内部で maxRetry: 0 を使用し、競合時は exit 6 で停止します。
code:bash
# 競合時: pull して最新版を確認後 push
cos sync pull "タイトル" --dir ./sync --project myproject
# 差分を確認して再 push
cos sync push "タイトル" --dir ./sync --project myproject
関連ページ