diff --git a/conn_pool.go b/conn_pool.go index 041ac830..0c5f87f7 100644 --- a/conn_pool.go +++ b/conn_pool.go @@ -214,34 +214,46 @@ func (p *ConnPool) QueryRow(sql string, args ...interface{}) *Row { // Begin acquires a connection and begins a transaction on it. When the // transaction is closed the connection will be automatically released. func (p *ConnPool) Begin() (*Tx, error) { - c, err := p.Acquire() - if err != nil { - return nil, err - } + for { + c, err := p.Acquire() + if err != nil { + return nil, err + } - tx, err := c.Begin() - if err != nil { - return nil, err - } + tx, err := c.Begin() + if err == ErrDeadConn { + p.Release(c) + continue + } + if err != nil { + return nil, err + } - tx.pool = p - return tx, nil + tx.pool = p + return tx, nil + } } // BeginIso acquires a connection and begins a transaction in isolation mode iso // on it. When the transaction is closed the connection will be automatically // released. func (p *ConnPool) BeginIso(iso string) (*Tx, error) { - c, err := p.Acquire() - if err != nil { - return nil, err - } + for { + c, err := p.Acquire() + if err != nil { + return nil, err + } - tx, err := c.BeginIso(iso) - if err != nil { - return nil, err - } + tx, err := c.BeginIso(iso) + if err == ErrDeadConn { + p.Release(c) + continue + } + if err != nil { + return nil, err + } - tx.pool = p - return tx, nil + tx.pool = p + return tx, nil + } }