Open3
DB設計 データべース設計
DB設計で大事なこと
結構シンプルにまとまってて良い
排他制御 楽観ロック
楽観ロックを実現するために「現在保持しているバージョン == DB上のバージョン」であることを確認してから「データストアへの保存を行う」という処理を書こうとしたが、何か違和感があった。
→その違和感は正しい。結局、バージョンチェックとデータストアへの保存はDBMSのトランザクションで守らなければならない。
// ダメ実装
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();
}
データ不整合の種類や、トランザクション分離レベルの説明とともに、楽観ロックの実装例を解説している記事。わかりやすい。
楽観ロックの実装例