aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend/db/txmanager.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/db/txmanager.go')
-rw-r--r--backend/db/txmanager.go40
1 files changed, 40 insertions, 0 deletions
diff --git a/backend/db/txmanager.go b/backend/db/txmanager.go
new file mode 100644
index 0000000..9495288
--- /dev/null
+++ b/backend/db/txmanager.go
@@ -0,0 +1,40 @@
+package db
+
+import (
+ "context"
+ "log/slog"
+
+ "github.com/jackc/pgx/v5"
+ "github.com/jackc/pgx/v5/pgxpool"
+)
+
+type TxManager interface {
+ RunInTx(ctx context.Context, fn func(q Querier) error) error
+}
+
+type PgxTxManager struct {
+ pool *pgxpool.Pool
+ queries *Queries
+}
+
+func NewTxManager(pool *pgxpool.Pool, queries *Queries) *PgxTxManager {
+ return &PgxTxManager{pool: pool, queries: queries}
+}
+
+func (m *PgxTxManager) RunInTx(ctx context.Context, fn func(q Querier) error) error {
+ tx, err := m.pool.Begin(ctx)
+ if err != nil {
+ return err
+ }
+ defer func() {
+ if err := tx.Rollback(ctx); err != nil && err != pgx.ErrTxClosed {
+ slog.Error("failed to rollback transaction", "error", err)
+ }
+ }()
+
+ qtx := m.queries.WithTx(tx)
+ if err := fn(qtx); err != nil {
+ return err
+ }
+ return tx.Commit(ctx)
+}