Repository navigation
Transactions
Ahmad Faiz Kamaludin edited this page Oct 18, 2026
·
2 revisions
err := conn.Transaction(ctx, func(tx *db.DB) error {
if _, err := tx.Update("accounts").Decrement("balance", 50).Where("id", 1).Exec(ctx); err != nil {
return err // rolls back
}
_, err := tx.Update("accounts").Increment("balance", 50).Where("id", 2).Exec(ctx)
return err // nil commits
})| Situation | Result |
|---|---|
Callback returns nil
|
Commit |
| Callback returns an error | Rollback, the error is returned |
| Callback panics | Rollback, then the panic is re-raised |
runtime.Goexit in the callback |
Handled safely |
-
Use
tx, notconn, inside the function.txis bound to the transaction. Statements run onconnare outside it. - A connection that cannot begin transactions returns
db.ErrNoTransaction.
A nested Transaction call uses a savepoint (savepoint sp_1 ... rollback to savepoint / release savepoint). An inner failure can be undone without aborting the outer transaction.
err := conn.Transaction(ctx, func(tx *db.DB) error {
// ... main work ...
if err := tx.Transaction(ctx, func(inner *db.DB) error {
return optionalStep(inner) // failure rolls back to the savepoint only
}); err != nil {
log.Println("optional step skipped:", err)
}
return nil // outer commits
})A db.New(sqlTx, dialect) built on an existing *sql.Tx also uses savepoints.
err := conn.TransactionOpts(ctx,
&sql.TxOptions{Isolation: sql.LevelSerializable, ReadOnly: true},
func(tx *db.DB) error {
// ...
return nil
},
)Options are ignored for nested savepoints.
Row locks (LockForUpdate, SharedLock) belong inside a transaction:
err := conn.Transaction(ctx, func(tx *db.DB) error {
var acc Account
if err := tx.Select().From("accounts").Where("id", 1).LockForUpdate().First(ctx, &acc); err != nil {
return err
}
// ... safe to modify acc's row ...
return nil
})SQLite ignores row locks. See Select Queries.
quill wiki · v0.2.0 · Repository · pkg.go.dev · Report an issue · MIT License
Basics
Building queries
Data access
- Writing Data
- Reading Data
- Pagination and Chunking
- Transactions
- Typed API
- Struct Mapping
- Hooks and Options
Reference
Guides