docs
Transactions

Transactions

ACID transactions for SQL drivers: PostgreSQL, MySQL, CockroachDB, Snowflake. MongoDB and Cassandra return ErrUnsupported.

Basic Transaction

err := db.Tx(ctx, func(tx *gormicx.Tx) error {
    if err := tx.Create(ctx, &Order{UserID: 1, Total: 99.99}); err != nil {
        return err // automatic ROLLBACK
    }
    if _, err := tx.Find(ctx, &Inventory{}).
        Where(clause.Eq("id", 1)).
        Set(map[string]any{"stock": gormicx.Expr("stock - 1")}); err != nil {
        return err // automatic ROLLBACK
    }
    return nil // COMMIT
})

Returning any non-nil error triggers ROLLBACK. Returning nil triggers COMMIT.

Panic Recovery

Panics inside the callback are caught, ROLLBACK is called, then the panic is re-raised:

err := db.Tx(ctx, func(tx *gormicx.Tx) error {
    tx.Create(ctx, &Order{UserID: 1})
    panic("something went wrong") // rollback called before re-panic
    return nil
})

Unsupported Drivers

err := db.Tx(ctx, func(tx *gormicx.Tx) error {
    return nil
})
if errors.Is(err, gormicx.ErrUnsupported) {
    // driver does not support transactions
}