// NewLocalTransaction allows sqladapter start a transaction block. func (d *database) NewLocalTransaction() (sqladapter.DatabaseTx, error) { clone, err := d.clone() if err != nil { return nil, err } clone.txMu.Lock() defer clone.txMu.Unlock() connFn := func() error { sqlTx, err := clone.BaseDatabase.Session().Begin() if err == nil { return clone.BindTx(sqlTx) } return err } if err := d.BaseDatabase.WaitForConnection(connFn); err != nil { return nil, err } return sqladapter.NewTx(clone), nil }
// NewTx returns a transaction session. func NewTx(sqlTx *sql.Tx) (sqlbuilder.Tx, error) { d, err := newDatabase(nil) if err != nil { return nil, err } // Binding with sqladapter's logic. d.BaseDatabase = sqladapter.NewBaseDatabase(d) // Binding with sqlbuilder. b, err := sqlbuilder.WithSession(d.BaseDatabase, template) if err != nil { return nil, err } d.Builder = b if err := d.BaseDatabase.BindTx(sqlTx); err != nil { return nil, err } newTx := sqladapter.NewTx(d) return &tx{DatabaseTx: newTx}, nil }