Open3

DB設計 データべース設計

やまやま

排他制御 楽観ロック

楽観ロックを実現するために「現在保持しているバージョン == DB上のバージョン」であることを確認してから「データストアへの保存を行う」という処理を書こうとしたが、何か違和感があった。
→その違和感は正しい。結局、バージョンチェックとデータストアへの保存はDBMSのトランザクションで守らなければならない。
https://zenn.dev/kittybbit/articles/dfd7284f5ff10a

// ダメ実装
async function update(data: FooData): Promise<void> {
  const currentData = await this.get(data.id);
  if (!currentData) throw new Error("Data not found");

  if (currentData.version !== data.version)
    throw new Error("Version conflict detected");

  this.store.set(data.id, {
    ...data,
    version: data.version + 1,
  });
}

// OK実装
async function update(data: FooData): Promise<void> {
  await this.store.startTransaction();

  const currentData = await this.store.get(data.id);
  if (!currentData) throw new Error("Data not found");

  if (currentData.version !== data.version)
    throw new Error("Version conflict detected");

  this.store.set(data.id, {
    ...data,
    version: data.version + 1,
  });

  await this.store.commit();
}