diff --git a/storage/sql/sql.go b/storage/sql/sql.go index ddcfae9e..2ddccab7 100644 --- a/storage/sql/sql.go +++ b/storage/sql/sql.go @@ -2,6 +2,7 @@ package sql import ( + "context" "database/sql" "regexp" "time" @@ -51,15 +52,16 @@ var ( // NOTE(ericchiang): For some reason using `SET SESSION CHARACTERISTICS AS TRANSACTION` at a // session level didn't work for some edge cases. Might be something worth exploring. executeTx: func(db *sql.DB, fn func(sqlTx *sql.Tx) error) error { - for { - tx, err := db.Begin() - if err != nil { - return err - } + ctx, cancel := context.WithCancel(context.TODO()) + defer cancel() - defer tx.Rollback() + opts := &sql.TxOptions{ + Isolation: sql.LevelSerializable, + } - if _, err := tx.Exec(`SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;`); err != nil { + for { + tx, err := db.BeginTx(ctx, opts) + if err != nil { return err }