Transaksi di Drizzle ORM: db.transaction() untuk operasi atomic yang di-rollback jika gagal, nested transactions (savepoints) di PostgreSQL, batch operations dengan db.batch() untuk operasi independen dalam satu round-trip, serta kapan menggunakan transaction vs batch.

Setelah di episode 12 kita mempelajari Drizzle Studio — GUI visual untuk browse dan edit data — pada episode ini kita membahas transactions dan batch operations: bagaimana menjalankan beberapa operasi secara atomic, dan bagaimana mengoptimalkan performa untuk operasi independen.
Transactions memastikan bahwa beberapa operasi database bersifat all-or-nothing — semua berhasil, atau semua gagal. Batch operations mengoptimalkan performa dengan menggabungkan beberapa operasi dalam satu round-trip.
await db.transaction(async (tx) => {
await tx.insert(users).values({ name: 'John', email: 'john@example.com' })
await tx.insert(posts).values({ title: 'Hello', authorId: 1 })
// Jika ada error di sini, SEMUA perubahan di-rollback
})Jika callback transaction throw error, semua perubahan di-rollback. Jika success, semua perubahan di-commit secara atomic.
PostgreSQL mendukung savepoints — nested transactions di dalam transaction:
await db.transaction(async (tx) => {
await tx.insert(users).values({ name: 'John' })
// Nested transaction
await tx.transaction(async (nestedTx) => {
await nestedTx.insert(posts).values({ title: 'Post 1' })
await nestedTx.insert(posts).values({ title: 'Post 2' })
})
// Jika nested transaction gagal, hanya nested yang di-rollback
// Transaction utama tetap berjalan
})MySQL dan SQLite memiliki batasan untuk nested transactions.
await db.batch([
db.insert(users).values({ name: 'John' }),
db.insert(users).values({ name: 'Jane' }),
db.insert(users).values({ name: 'Bob' }),
])Batch menggabungkan beberapa operasi dalam satu round-trip ke database — lebih cepat daripada menjalankan satu per satu.
| Aspek | Transaction | Batch |
|---|---|---|
| Dependency | Ada dependency antar operasi | Operasi independen |
| Rollback | Rollback jika gagal | Tidak ada rollback |
| Use case | Transfer uang, order processing | Bulk insert, data migration |
| Performance | Sama | Lebih cepat (single round-trip) |
Warning
Gunakan transaction saat ada dependency antar operasi dan kalian butuh rollback jika gagal. Gunakan batch saat operasi independen dan kalian ingin performa lebih baik. Jangan gunakan batch untuk operasi yang harus atomic.
Pada episode 13 ini, kalian telah memahami Transactions & Batch:
db.transaction(): operasi atomic, rollback jika gagal.db.batch(): operasi independen, satu round-trip, lebih cepat.Di episode 14 selanjutnya kita akan mempelajari Prepared Statements & Performance — caching SQL di database server, reuse across requests, dan profiling queries. Sampai jumpa di episode 14!