diff --git a/db.go b/db.go index d78062e5..cc18c015 100644 --- a/db.go +++ b/db.go @@ -733,13 +733,32 @@ func (m *DbMap) SelectOne(holder interface{}, query string, args ...interface{}) return SelectOne(m, m, holder, query, args...) } +type beginOptions struct { + txOptions *sql.TxOptions +} + +type BeginOpt func(beginOptions) beginOptions + +func TxOptions(opts *sql.TxOptions) BeginOpt { + return func(o beginOptions) beginOptions { + o.txOptions = opts + return o + } +} + // Begin starts a gorp Transaction func (m *DbMap) Begin() (*Transaction, error) { + return m.BeginOption(nil) +} + +// BeginOption starts a gorp Transaction with sql.TxOptions +func (m *DbMap) BeginOption(opts ...BeginOpt) (*Transaction, error) { if m.logger != nil { now := time.Now() defer m.trace(now, "begin;") } - tx, err := begin(m) + + tx, err := begin(m, opts...) if err != nil { return nil, err } diff --git a/gorp.go b/gorp.go index fc654567..e29b6386 100644 --- a/gorp.go +++ b/gorp.go @@ -663,10 +663,16 @@ func query(e SqlExecutor, query string, args ...interface{}) (*sql.Rows, error) return executor.Query(query, args...) } -func begin(m *DbMap) (*sql.Tx, error) { - if m.ctx != nil { - return m.Db.BeginTx(m.ctx, nil) +func begin(m *DbMap, opts ...BeginOpt) (*sql.Tx, error) { + opt := beginOptions{} + for _, o := range opts { + opt = o(opt) } - return m.Db.Begin() + ctx := m.ctx + if ctx == nil { + ctx = context.Background() + } + + return m.Db.BeginTx(ctx, opt.txOptions) }