On Thu, Dec 6, 2018 at 12:16 AM roger peppe <rogpe...@gmail.com> wrote:

>
>
> On Wed, 5 Dec 2018 at 18:55, 'Eric Johnson' via golang-nuts <
> golang-nuts@googlegroups.com> wrote:
>
>> I always go with the approach that uses the equivalent of the
>> "Transact()" method.
>>
>> On top of that, rather than use a generic *sql.Tx parameter to the
>> "txFunc" function, I pass an interface that is specific to the operations
>> of the database layer for my application.
>>
>
> That's an interesting idea. For the record, this is the code we use:
>

This is one of *the* places in my code where I'd probably immediately take
advantage of "generics" in Go. This function to wrap transactions could be
written generically, and then not have to be copied from application to
application. While I could go with the work-around to leave the function in
the *sql.Tx parameter form, the other approach is *so* useful that I copy
the function instead.

Eric


>
>     package transaction
>
>     import (
>         "context"
>         "database/sql"
>         "fmt"
>
>         "gopkg.in/errgo.v1"
>     )
>
>     // WithTxn executes a function inside a transaction context.
>     func WithTxn(db *sql.DB, ctx context.Context, f func(*sql.Tx) error)
> error {
>         txn, err := db.BeginTx(ctx, nil)
>         if err != nil {
>             return errgo.Mask(err)
>         }
>         if err := f(txn); err != nil {
>             return rollback(txn, err)
>         }
>         return rollback(txn, txn.Commit())
>     }
>
>     func rollback(txn *sql.Tx, err error) error {
>         if err == nil {
>             return nil
>         }
>         errRollback := txn.Rollback()
>         if errRollback != nil {
>             return errgo.NoteMask(err, fmt.Sprintf("failed to roll back
> (error: %v) after", errRollback), errgo.Any)
>         }
>         return err
>     }
>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to