From 06b4960984ef88aa9fe71efa5206004720956715 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Mon, 11 Nov 2024 00:35:33 +0800 Subject: [PATCH] fix the failure of creating account with initial balance sometimes --- pkg/services/accounts.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/pkg/services/accounts.go b/pkg/services/accounts.go index 9a976d1c..d942b329 100644 --- a/pkg/services/accounts.go +++ b/pkg/services/accounts.go @@ -276,10 +276,31 @@ func (s *AccountService) CreateAccounts(c core.Context, mainAccount *models.Acco for i := 0; i < len(allInitTransactions); i++ { transaction := allInitTransactions[i] - _, err := sess.Insert(transaction) + createdRows, err := sess.Insert(transaction) - if err != nil { - return err + if err != nil || createdRows < 1 { // maybe another transaction has same time + sameSecondLatestTransaction := &models.Transaction{} + minTransactionTime := utils.GetMinTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime)) + maxTransactionTime := utils.GetMaxTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime)) + + has, err := sess.Where("uid=? AND transaction_time>=? AND transaction_time<=?", transaction.Uid, minTransactionTime, maxTransactionTime).OrderBy("transaction_time desc").Limit(1).Get(sameSecondLatestTransaction) + + if err != nil { + return err + } else if !has { + return errs.ErrDatabaseOperationFailed + } else if sameSecondLatestTransaction.TransactionTime == maxTransactionTime-1 { + return errs.ErrTooMuchTransactionInOneSecond + } + + transaction.TransactionTime = sameSecondLatestTransaction.TransactionTime + 1 + createdRows, err := sess.Insert(transaction) + + if err != nil { + return err + } else if createdRows < 1 { + return errs.ErrDatabaseOperationFailed + } } }