Transactions not inheriting query tracers
Describe the bug Starting a tranaction does not include it's tracers.
To Reproduce
Run below code:
package main
import (
"context"
"fmt"
"log"
"github.com/jackc/pgx/v5"
)
// ...
// tracer code removed for brevity
func run() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
conncfg, err := pgx.ParseConfig("postgres://user:password@localhost:5432/dbname")
if err != nil {
log.Fatal(err)
}
conncfg.Tracer = NewPGTracer(
func(format string, v ...any) {
log.Printf("[SQL] "+format, v...)
},
)
conn, err := pgx.ConnectConfig(ctx, conncfg)
if err != nil {
log.Fatal(err)
}
defer conn.Close(ctx)
tx, err := conn.Begin(context.Background())
if err != nil {
log.Fatal(err)
}
defer func() {
if p := recover(); p != nil {
log.Println("Panic occurred:", p)
err = tx.Rollback(ctx)
if err != nil {
log.Printf("Failed to rollback transaction: %v", err)
}
panic(p)
} else if err != nil {
if e := tx.Rollback(ctx); e != nil {
err = fmt.Errorf("failed to rollback transaction: %w", e)
}
log.Println("Transaction rolled back due to error:", err)
} else {
err = tx.Commit(ctx)
if err != nil {
log.Fatal(err)
}
log.Println("Transaction committed successfully")
}
}()
query := "INSERT INTO data (key, value) VALUES ($1, $2)"
batch := &pgx.Batch{}
batch.Queue(query, "key1", "value1")
batch.Queue(query, "key2", "value2")
batch.Queue(query, "key3", "value3")
results := tx.SendBatch(ctx, batch)
defer func() {
if err := results.Close(); err != nil {
log.Fatal(err)
}
}()
for range batch.Len() {
if _, err := results.Exec(); err != nil {
log.Fatal(err)
}
}
log.Println("Batch executed successfully")
}
func main() {
run()
}
Expected behavior The tracer should be able to capture logs from the nested tranaction.
Actual behavior The tracer didn't capture logs from the transaction.
Version
- Go:
go version go1.24.2 linux/amd64 - PostgreSQL:
17.4 - pgx:
v5.7.4
Additional context The tracers works when running queries without creating transaction.
Full code: https://gist.github.com/sansmoraxz/06df10bb089fb04a70143083c40ed98a
Your full example is fairly long, so I didn't debug it. But I did add a working test to the pgx test suite that shows the tracer executing in a transaction, so I don't think executing in the transaction is the issue. e9aad0fb0b55c42f1ff2e2106c65aab8b3da724c