Skip to content

Transactions

Robust transaction helpers built on Bun’s sql.begin.

Basics

ts
await db.transaction(async tx => {
  await tx.insertInto('users').values({ name: 'Zed' }).execute()
}, {
  retries: 3,
  isolation: 'serializable',
  onRetry: (attempt, err) => console.warn('retry', attempt, err),
  afterCommit: () => console.log('committed'),
})

Savepoints

ts
await db.transaction(async tx => {
  await tx.savepoint(async sp => {
    await sp.updateTable('orders').set({ status: 'processing' }).where(['id', '=', 1]).execute()
  })
})

Distributed

ts
await db.beginDistributed('tx1', async tx => { /* ... */ })
await db.commitDistributed('tx1')

Best Practices

  • Use retries for serialization/deadlock-prone workloads
  • Log retries and use exponential backoff (default)
  • Keep transactions short and deterministic

Released under the MIT License.