2
0

Add comments

This commit is contained in:
Dan Gillis
2021-09-10 12:27:40 -04:00
committed by Jack Christensen
parent 435605a59c
commit 8876b3a4ff
4 changed files with 26 additions and 0 deletions
+2
View File
@@ -70,10 +70,12 @@ func (c *Conn) CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNam
return c.Conn().CopyFrom(ctx, tableName, columnNames, rowSrc) return c.Conn().CopyFrom(ctx, tableName, columnNames, rowSrc)
} }
// Begin starts a transaction block from the *Conn without explicitly setting a transaction mode (see BeginTx with TxOptions if transaction mode is required).
func (c *Conn) Begin(ctx context.Context) (pgx.Tx, error) { func (c *Conn) Begin(ctx context.Context) (pgx.Tx, error) {
return c.Conn().Begin(ctx) return c.Conn().Begin(ctx)
} }
// BeginTx starts a transaction block from the *Conn with txOptions determining the transaction mode.
func (c *Conn) BeginTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, error) { func (c *Conn) BeginTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, error) {
return c.Conn().BeginTx(ctx, txOptions) return c.Conn().BeginTx(ctx, txOptions)
} }
+12
View File
@@ -375,6 +375,7 @@ func (p *Pool) checkMinConns() {
} }
} }
// Acquire returns a connection (*Conn) from the Pool
func (p *Pool) Acquire(ctx context.Context) (*Conn, error) { func (p *Pool) Acquire(ctx context.Context) (*Conn, error) {
for { for {
res, err := p.p.Acquire(ctx) res, err := p.p.Acquire(ctx)
@@ -483,9 +484,18 @@ func (p *Pool) SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults {
return &poolBatchResults{br: br, c: c} return &poolBatchResults{br: br, c: c}
} }
// Begin acquires a connection from the Pool and starts a transaction. Unlike database/sql, the context only affects the begin command. i.e. there is no
// auto-rollback on context cancellation. Begin initiates a transaction block without explicitly setting a transaction mode for the block (see BeginTx with TxOptions if transaction mode is required).
// *pgxpool.Tx is returned, which implements the pgx.Tx interface.
// Commit or Rollback must be called on the returned transaction to finalize the transaction block.
func (p *Pool) Begin(ctx context.Context) (pgx.Tx, error) { func (p *Pool) Begin(ctx context.Context) (pgx.Tx, error) {
return p.BeginTx(ctx, pgx.TxOptions{}) return p.BeginTx(ctx, pgx.TxOptions{})
} }
// BeginTx acquires a connection from the Pool and starts a transaction with pgx.TxOptions determining the transaction mode.
// Unlike database/sql, the context only affects the begin command. i.e. there is no auto-rollback on context cancellation.
// *pgxpool.Tx is returned, which implements the pgx.Tx interface.
// Commit or Rollback must be called on the returned transaction to finalize the transaction block.
func (p *Pool) BeginTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, error) { func (p *Pool) BeginTx(ctx context.Context, txOptions pgx.TxOptions) (pgx.Tx, error) {
c, err := p.Acquire(ctx) c, err := p.Acquire(ctx)
if err != nil { if err != nil {
@@ -525,6 +535,8 @@ func (p *Pool) CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNam
return c.Conn().CopyFrom(ctx, tableName, columnNames, rowSrc) return c.Conn().CopyFrom(ctx, tableName, columnNames, rowSrc)
} }
// Ping acquires a connection from the Pool and executes an empty sql statement against it.
// If the sql returns without error, the database Ping is considered successful, otherwise, the error is returned.
func (p *Pool) Ping(ctx context.Context) error { func (p *Pool) Ping(ctx context.Context) error {
c, err := p.Acquire(ctx) c, err := p.Acquire(ctx)
if err != nil { if err != nil {
+8
View File
@@ -7,11 +7,13 @@ import (
"github.com/jackc/pgx/v4" "github.com/jackc/pgx/v4"
) )
// Tx represents a database transaction acquired from a Pool.
type Tx struct { type Tx struct {
t pgx.Tx t pgx.Tx
c *Conn c *Conn
} }
// Begin starts a pseudo nested transaction implemented with a savepoint.
func (tx *Tx) Begin(ctx context.Context) (pgx.Tx, error) { func (tx *Tx) Begin(ctx context.Context) (pgx.Tx, error) {
return tx.t.Begin(ctx) return tx.t.Begin(ctx)
} }
@@ -20,6 +22,9 @@ func (tx *Tx) BeginFunc(ctx context.Context, f func(pgx.Tx) error) error {
return tx.t.BeginFunc(ctx, f) return tx.t.BeginFunc(ctx, f)
} }
// Commit commits the transaction and returns the associated connection back to the Pool. Commit will return ErrTxClosed
// if the Tx is already closed, but is otherwise safe to call multiple times. If the commit fails with a rollback status
// (e.g. the transaction was already in a broken state) then ErrTxCommitRollback will be returned.
func (tx *Tx) Commit(ctx context.Context) error { func (tx *Tx) Commit(ctx context.Context) error {
err := tx.t.Commit(ctx) err := tx.t.Commit(ctx)
if tx.c != nil { if tx.c != nil {
@@ -29,6 +34,9 @@ func (tx *Tx) Commit(ctx context.Context) error {
return err return err
} }
// Rollback rolls back the transaction and returns the associated connection back to the Pool. Rollback will return ErrTxClosed
// if the Tx is already closed, but is otherwise safe to call multiple times. Hence, defer tx.Rollback() is safe even if
// tx.Commit() will be called first in a non-error condition.
func (tx *Tx) Rollback(ctx context.Context) error { func (tx *Tx) Rollback(ctx context.Context) error {
err := tx.t.Rollback(ctx) err := tx.t.Rollback(ctx)
if tx.c != nil { if tx.c != nil {
+4
View File
@@ -10,6 +10,7 @@ import (
"github.com/jackc/pgconn" "github.com/jackc/pgconn"
) )
// TxIsoLevel is the transaction isolation level (serializable, repeatable read, read committed or read uncommitted)
type TxIsoLevel string type TxIsoLevel string
// Transaction isolation levels // Transaction isolation levels
@@ -20,6 +21,7 @@ const (
ReadUncommitted = TxIsoLevel("read uncommitted") ReadUncommitted = TxIsoLevel("read uncommitted")
) )
// TxAccessMode is the transaction access mode (read write or read only)
type TxAccessMode string type TxAccessMode string
// Transaction access modes // Transaction access modes
@@ -28,6 +30,7 @@ const (
ReadOnly = TxAccessMode("read only") ReadOnly = TxAccessMode("read only")
) )
// TxDeferrableMode is the transaction deferrable mode (deferrable or not deferrable)
type TxDeferrableMode string type TxDeferrableMode string
// Transaction deferrable modes // Transaction deferrable modes
@@ -36,6 +39,7 @@ const (
NotDeferrable = TxDeferrableMode("not deferrable") NotDeferrable = TxDeferrableMode("not deferrable")
) )
// TxOptions are transaction modes within a transaction block
type TxOptions struct { type TxOptions struct {
IsoLevel TxIsoLevel IsoLevel TxIsoLevel
AccessMode TxAccessMode AccessMode TxAccessMode