projectx/internal/pkg/mid/transaction.go
2025-06-18 17:50:02 +08:00

58 lines
1.0 KiB
Go

package mid
import (
"database/sql"
"errors"
"net/http"
"management/internal/pkg/sqldb"
"github.com/drhin/logger"
"go.uber.org/zap"
)
func BeginCommitRollback(log *logger.Logger, bgn sqldb.Beginner) func(http.Handler) http.Handler {
m := func(next http.Handler) http.Handler {
h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
hasCommitted := false
log.Info("BEGIN TRANSACTION")
tx, err := bgn.Begin()
if err != nil {
log.Error("BEGIN TRANSACTION", err)
return
}
defer func() {
if !hasCommitted {
log.Info("ROLLBACK TRANSACTION")
}
if err := tx.Rollback(); err != nil {
if errors.Is(err, sql.ErrTxDone) {
return
}
log.Info("ROLLBACK TRANSACTION", zap.Error(err))
}
}()
ctx := r.Context()
ctx = setTran(ctx, tx)
next.ServeHTTP(w, r.WithContext(ctx))
log.Info("COMMIT TRANSACTION")
if err := tx.Commit(); err != nil {
log.Error("COMMIT TRANSACTION", err)
return
}
hasCommitted = true
})
return h
}
return m
}