extract and document serialization failure check
This commit is contained in:
		@@ -40,6 +40,21 @@ func matchLiteral(s string) *regexp.Regexp {
 | 
			
		||||
	return regexp.MustCompile(`\b` + regexp.QuoteMeta(s) + `\b`)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Detect a serialization failure, which should trigger retrying the
 | 
			
		||||
// transaction according to PostgreSQL docs:
 | 
			
		||||
//
 | 
			
		||||
// https://www.postgresql.org/docs/current/transaction-iso.html#XACT-SERIALIZABLE
 | 
			
		||||
//
 | 
			
		||||
// "applications using this level must be prepared to retry transactions due to
 | 
			
		||||
// serialization failures"
 | 
			
		||||
func isRetryableSerializationFailure(err error) bool {
 | 
			
		||||
	if pqErr, ok := err.(*pq.Error); ok {
 | 
			
		||||
		return pqErr.Code.Name() == "serialization_failure"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// The "github.com/lib/pq" driver is the default flavor. All others are
 | 
			
		||||
	// translations of this.
 | 
			
		||||
@@ -67,8 +82,7 @@ var (
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if err := fn(tx); err != nil {
 | 
			
		||||
					if pqErr, ok := err.(*pq.Error); ok && pqErr.Code.Name() == "serialization_failure" {
 | 
			
		||||
						// serialization error; retry
 | 
			
		||||
					if isRetryableSerializationFailure(err) {
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
@@ -77,8 +91,7 @@ var (
 | 
			
		||||
 | 
			
		||||
				err = tx.Commit()
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					if pqErr, ok := err.(*pq.Error); ok && pqErr.Code.Name() == "serialization_failure" {
 | 
			
		||||
						// serialization error; retry
 | 
			
		||||
					if isRetryableSerializationFailure(err) {
 | 
			
		||||
						continue
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user