fix(model): centralize row locking in transactional flows
This commit is contained in:
@@ -565,7 +565,7 @@ func CompleteSubscriptionOrder(tradeNo string, providerPayload string, expectedP
|
||||
var upgradeGroup string
|
||||
err := DB.Transaction(func(tx *gorm.DB) error {
|
||||
var order SubscriptionOrder
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").Where(refCol+" = ?", tradeNo).First(&order).Error; err != nil {
|
||||
if err := lockForUpdate(tx).Where(refCol+" = ?", tradeNo).First(&order).Error; err != nil {
|
||||
return ErrSubscriptionOrderNotFound
|
||||
}
|
||||
if expectedPaymentProvider != "" && order.PaymentProvider != expectedPaymentProvider {
|
||||
@@ -668,7 +668,7 @@ func ExpireSubscriptionOrder(tradeNo string, expectedPaymentProvider string) err
|
||||
}
|
||||
return DB.Transaction(func(tx *gorm.DB) error {
|
||||
var order SubscriptionOrder
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").Where(refCol+" = ?", tradeNo).First(&order).Error; err != nil {
|
||||
if err := lockForUpdate(tx).Where(refCol+" = ?", tradeNo).First(&order).Error; err != nil {
|
||||
return ErrSubscriptionOrderNotFound
|
||||
}
|
||||
if expectedPaymentProvider != "" && order.PaymentProvider != expectedPaymentProvider {
|
||||
@@ -751,7 +751,7 @@ func PurchaseSubscriptionWithBalance(userId int, planId int) error {
|
||||
}
|
||||
|
||||
var user User
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").Where("id = ?", userId).First(&user).Error; err != nil {
|
||||
if err := lockForUpdate(tx).Where("id = ?", userId).First(&user).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if requiredQuota > 0 && user.Quota < requiredQuota {
|
||||
@@ -899,7 +899,7 @@ func AdminInvalidateUserSubscription(userSubscriptionId int) (string, error) {
|
||||
var userId int
|
||||
err := DB.Transaction(func(tx *gorm.DB) error {
|
||||
var sub UserSubscription
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").
|
||||
if err := lockForUpdate(tx).
|
||||
Where("id = ?", userSubscriptionId).First(&sub).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -944,7 +944,7 @@ func AdminDeleteUserSubscription(userSubscriptionId int) (string, error) {
|
||||
var userId int
|
||||
err := DB.Transaction(func(tx *gorm.DB) error {
|
||||
var sub UserSubscription
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").
|
||||
if err := lockForUpdate(tx).
|
||||
Where("id = ?", userSubscriptionId).First(&sub).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1178,7 +1178,7 @@ func PreConsumeUserSubscription(requestId string, userId int, modelName string,
|
||||
}
|
||||
|
||||
var subs []UserSubscription
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").
|
||||
if err := lockForUpdate(tx).
|
||||
Where("user_id = ? AND status = ? AND end_time > ?", userId, "active", now).
|
||||
Order("end_time asc, id asc").
|
||||
Find(&subs).Error; err != nil {
|
||||
@@ -1251,7 +1251,7 @@ func RefundSubscriptionPreConsume(requestId string) error {
|
||||
}
|
||||
return DB.Transaction(func(tx *gorm.DB) error {
|
||||
var record SubscriptionPreConsumeRecord
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").
|
||||
if err := lockForUpdate(tx).
|
||||
Where("request_id = ?", requestId).First(&record).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -1295,7 +1295,7 @@ func ResetDueSubscriptions(limit int) (int, error) {
|
||||
}
|
||||
err = DB.Transaction(func(tx *gorm.DB) error {
|
||||
var locked UserSubscription
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").
|
||||
if err := lockForUpdate(tx).
|
||||
Where("id = ? AND next_reset_time > 0 AND next_reset_time <= ?", subCopy.Id, now).
|
||||
First(&locked).Error; err != nil {
|
||||
return nil
|
||||
@@ -1362,7 +1362,7 @@ func PostConsumeUserSubscriptionDelta(userSubscriptionId int, delta int64) error
|
||||
}
|
||||
return DB.Transaction(func(tx *gorm.DB) error {
|
||||
var sub UserSubscription
|
||||
if err := tx.Set("gorm:query_option", "FOR UPDATE").
|
||||
if err := lockForUpdate(tx).
|
||||
Where("id = ?", userSubscriptionId).
|
||||
First(&sub).Error; err != nil {
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user