have to manually close connection on commit/rollback
This commit is contained in:
@@ -79,20 +79,46 @@ func (d sqlDB) BeginTx(ctx context.Context, opts *sql.TxOptions) (db.Tx, error)
|
|||||||
|
|
||||||
// once we have a connection, begin the transaction
|
// once we have a connection, begin the transaction
|
||||||
tx, err = conn.BeginTx(ctx, opts)
|
tx, err = conn.BeginTx(ctx, opts)
|
||||||
if err == nil {
|
if err != nil {
|
||||||
return sqlTx{tx}, nil
|
if closeErr := conn.Close(); closeErr != nil {
|
||||||
|
d.log.Error("Failed to close connection after BeginTx error", "error", closeErr)
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, err
|
return sqlTx{Tx: tx, conn: conn}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sqlTx wraps sql.Tx to add connection management
|
||||||
|
// since we are manually acquiring the connection in BeginTx() we need to also manually close it after Commit/Rollback
|
||||||
type sqlTx struct {
|
type sqlTx struct {
|
||||||
*sql.Tx
|
*sql.Tx
|
||||||
|
conn *sql.Conn
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTx wraps an existing *sql.Tx with sqlTx
|
// NewTx wraps an existing *sql.Tx with sqlTx
|
||||||
func NewTx(tx *sql.Tx) db.Tx {
|
func NewTx(tx *sql.Tx) db.Tx {
|
||||||
return sqlTx{tx}
|
return sqlTx{Tx: tx}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tx sqlTx) Commit() error {
|
||||||
|
err := tx.Tx.Commit()
|
||||||
|
if tx.conn != nil {
|
||||||
|
if err = tx.conn.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tx sqlTx) Rollback() error {
|
||||||
|
err := tx.Tx.Rollback()
|
||||||
|
if tx.conn != nil {
|
||||||
|
if err = tx.conn.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tx sqlTx) QueryContext(ctx context.Context, query string, args ...any) (db.Rows, error) {
|
func (tx sqlTx) QueryContext(ctx context.Context, query string, args ...any) (db.Rows, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user