トランザクション
Kosameはcontext.transaction(callback)によるトランザクション機能を提供しています。
使い方
トランザクションの書き方としてcontext.transaction()を呼び引数としてcallbackを持たせます。
ts
await context.transaction(async (txContext) => {
const user = await txContext.users.add({ name: "kosame" });
});afterCommit()
afterCommit(callback)は、トランザクションのコールバック内で呼び出し、コミットが成功した後に実行したい処理を登録するメソッドです。
ts
await context.transaction(async (txContext) => {
const user = await txContext.users.add({ name: "kosame" });
txContext.afterCommit(() => {
console.log("コミットが成功しました");
});
});afterRollback()
afterRollback(callback)は、トランザクションのコールバック内で呼び出し、ロールバックが発生した後に実行したい処理を登録するメソッドです。
ts
await context.transaction(async (txContext) => {
const user = await txContext.users.add({ name: "kosame" });
txContext.afterRollback(() => {
console.log("ロールバックされました");
});
throw new Error("エラー");
});dialectの違い
sqlite以外のデータベースではDrizzleネイティブのdb.transaction()が処理をしています。ですがsqliteは例外でbun:sqlite/better-sqlite3のような同期ドライバでは、db.transaction()に非同期コールバックを渡すと正しく動作しません。 なのでsqliteでは、生SQLのBEGIN/COMMIT/ROLLBACK(ネストしている場合はSAVEPOINT)を手動発行で解決しています。
