Commit 7e960214 authored by Alex Suraci's avatar Alex Suraci

retry on serialization errors

parent efb15205
...@@ -6,10 +6,10 @@ import ( ...@@ -6,10 +6,10 @@ import (
"regexp" "regexp"
"time" "time"
"github.com/lib/pq"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
// import third party drivers // import third party drivers
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
...@@ -51,19 +51,34 @@ var ( ...@@ -51,19 +51,34 @@ var (
// NOTE(ericchiang): For some reason using `SET SESSION CHARACTERISTICS AS TRANSACTION` at a // 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. // 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 { executeTx: func(db *sql.DB, fn func(sqlTx *sql.Tx) error) error {
tx, err := db.Begin() for {
if err != nil { tx, err := db.Begin()
return err if err != nil {
} return err
defer tx.Rollback() }
if _, err := tx.Exec(`SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;`); err != nil { defer tx.Rollback()
return err
} if _, err := tx.Exec(`SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;`); err != nil {
if err := fn(tx); err != nil { return err
return err }
if err := fn(tx); err != nil {
return err
}
err = tx.Commit()
if err != nil {
if pqErr, ok := err.(*pq.Error); ok && pqErr.Code == "40001" {
// serialization error; retry
continue
}
return err
}
return nil
} }
return tx.Commit()
}, },
supportsTimezones: true, supportsTimezones: true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment