diff --git a/goatherd.go b/goatherd.go
index a098c38272e2ae76538e6e49c9da989a1101b6dc..88da4ae71d44cd7906a2f48132c59f2332d8ce39 100644
--- a/goatherd.go
+++ b/goatherd.go
@@ -318,7 +318,7 @@ func checkHOTP(hotp *twofactor.HOTP, remote string, name string, offer string) (
 		debugf("[%v] autoresync in progress: %v", remote, s)
 		if uint64(time.Now().Unix()-s.Time) <= cfg.AutoresyncTime {
 			if s.Num >= cfg.AutoresyncRepeat && s.Counter-hotp.Counter() < cfg.AutoresyncLookahead {
-				// if the user had a sufficient number of successful tries that were not within
+				// if the user had a sufficient number of consecutive tries that were not within
 				// standard lookahead range but within cfg.AutoresyncLookahead within cfg.AutoresyncTime seconds,
 				// temporarily increase lookahead to authenticate and resync.
 				debugf("[%v] autoresync conditions: increasing lookahead to ", cfg.AutoresyncLookahead)
@@ -374,49 +374,50 @@ func checkHOTP(hotp *twofactor.HOTP, remote string, name string, offer string) (
 // transaction, retrying if it fails.
 func checkOffer(remote string, name string, offer string) (bool, error) {
 	for {
-		debugf("[%v] begin transaction", remote)
-		tx, err := db.Begin()
-		errPanic(err)
+		inner := func(tx *sql.Tx) (bool, error) {
+			debugf("[%v] looking up data for %v", remote, name)
+			hotp, err := getOTP(tx, name)
+			if err != nil {
+				return false, err
+			}
 
-		ok := false
+			ok, err := checkHOTP(hotp, remote, name, offer)
+			if err != nil {
+				return false, err
+			}
 
-		debugf("[%v] looking up data for %v", remote, name)
-		hotp, err := getOTP(tx, name)
-		if transactionFailed(err) {
-			goto retry
-		} else if err == sql.ErrNoRows {
-			_ = tx.Rollback()
-			return false, err
-		}
-		errPanic(err)
+			if ok {
+				debugf("[%v] ok, set new count", remote)
+				err := setCount(tx, name, hotp.Counter())
+				if err != nil {
+					return false, err
+				}
+			}
 
-		ok, err = checkHOTP(hotp, remote, name, offer)
-		if transactionFailed(err) {
-			goto retry
+			debugf("[%v] commiting", remote)
+			err = tx.Commit()
+			if err != nil {
+				return false, err
+			}
+			return ok, nil
 		}
+
+		debugf("[%v] begin transaction", remote)
+		tx, err := db.Begin()
 		errPanic(err)
 
-		if ok {
-			debugf("[%v] ok, set new count", remote)
-			err := setCount(tx, name, hotp.Counter())
-			if transactionFailed(err) {
-				goto retry
+		ok, err := inner(tx)
+		if err != nil {
+			debugf("[%v] retry %v", remote, err)
+			_ = tx.Rollback()
+			if err == sql.ErrNoRows {
+				return false, nil
+			} else if transactionFailed(err) {
+				continue
 			}
 			errPanic(err)
 		}
-
-		debugf("[%v] commiting", remote)
-		err = tx.Commit()
-		if transactionFailed(err) {
-			goto retry
-		}
-		errPanic(err)
-
 		return ok, nil
-
-	retry:
-		debugf("[%v] retry", remote)
-		_ = tx.Rollback()
 	}
 }