pgx icon indicating copy to clipboard operation
pgx copied to clipboard

Transactions not inheriting query tracers

Open sansmoraxz opened this issue 8 months ago • 1 comments

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

sansmoraxz avatar Apr 22 '25 07:04 sansmoraxz

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

jackc avatar Apr 26 '25 14:04 jackc