improve performance

This commit is contained in:
MaysWind
2025-04-30 00:07:27 +08:00
parent 0af5b194fc
commit 850fbffdde
+95 -75
View File
@@ -1092,54 +1092,64 @@ func (s *TransactionService) DeleteTransaction(c core.Context, uid int64, transa
// Update account table // Update account table
if oldTransaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE { if oldTransaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if oldTransaction.RelatedAccountAmount != 0 {
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", oldTransaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", oldTransaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
return err return err
} else if updatedRows < 1 { } else if updatedRows < 1 {
log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance") log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_INCOME { } else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_INCOME {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if oldTransaction.Amount != 0 {
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", oldTransaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", oldTransaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
return err return err
} else if updatedRows < 1 { } else if updatedRows < 1 {
log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance") log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_EXPENSE { } else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_EXPENSE {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if oldTransaction.Amount != 0 {
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", oldTransaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", oldTransaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
return err return err
} else if updatedRows < 1 { } else if updatedRows < 1 {
log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance") log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_OUT { } else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_OUT {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if oldTransaction.Amount != 0 {
updatedSourceRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", oldTransaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedSourceRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", oldTransaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
return err return err
} else if updatedSourceRows < 1 { } else if updatedSourceRows < 1 {
log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance") log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
destinationAccount.UpdatedUnixTime = time.Now().Unix() if oldTransaction.RelatedAccountAmount != 0 {
updatedDestinationRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", oldTransaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount) destinationAccount.UpdatedUnixTime = time.Now().Unix()
updatedDestinationRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", oldTransaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount)
if err != nil { if err != nil {
return err return err
} else if updatedDestinationRows < 1 { } else if updatedDestinationRows < 1 {
log.Errorf(c, "[transactions.DeleteTransaction] failed to update account balance") log.Errorf(c, "[transactions.DeleteTransaction] failed to update related account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_IN { } else if oldTransaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_IN {
return errs.ErrTransactionTypeInvalid return errs.ErrTransactionTypeInvalid
@@ -1777,59 +1787,69 @@ func (s *TransactionService) doCreateTransaction(c core.Context, database *datas
// Update account table // Update account table
if transaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE { if transaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if transaction.RelatedAccountAmount != 0 {
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error()) log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err return err
} else if updatedRows < 1 { } else if updatedRows < 1 {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance") log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if transaction.Type == models.TRANSACTION_DB_TYPE_INCOME { } else if transaction.Type == models.TRANSACTION_DB_TYPE_INCOME {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if transaction.Amount != 0 {
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error()) log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err return err
} else if updatedRows < 1 { } else if updatedRows < 1 {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance") log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if transaction.Type == models.TRANSACTION_DB_TYPE_EXPENSE { } else if transaction.Type == models.TRANSACTION_DB_TYPE_EXPENSE {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if transaction.Amount != 0 {
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error()) log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err return err
} else if updatedRows < 1 { } else if updatedRows < 1 {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance") log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if transaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_OUT { } else if transaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_OUT {
sourceAccount.UpdatedUnixTime = time.Now().Unix() if transaction.Amount != 0 {
updatedSourceRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount) sourceAccount.UpdatedUnixTime = time.Now().Unix()
updatedSourceRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil { if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error()) log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err return err
} else if updatedSourceRows < 1 { } else if updatedSourceRows < 1 {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance") log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
destinationAccount.UpdatedUnixTime = time.Now().Unix() if transaction.RelatedAccountAmount != 0 {
updatedDestinationRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount) destinationAccount.UpdatedUnixTime = time.Now().Unix()
updatedDestinationRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount)
if err != nil { if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error()) log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err return err
} else if updatedDestinationRows < 1 { } else if updatedDestinationRows < 1 {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance") log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance")
return errs.ErrDatabaseOperationFailed return errs.ErrDatabaseOperationFailed
}
} }
} else if transaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_IN { } else if transaction.Type == models.TRANSACTION_DB_TYPE_TRANSFER_IN {
return errs.ErrTransactionTypeInvalid return errs.ErrTransactionTypeInvalid