@@ -231,11 +231,10 @@ func deleteTenantAI(tx *gorm.DB, id uint, result *tenantDeleteResult) error {
|
||||
if len(channelIDs) == 0 {
|
||||
return nil
|
||||
}
|
||||
callIDs, err := lockedAiCallIDs(tx, channelIDs)
|
||||
if err != nil {
|
||||
if err := lockAiCallRows(tx, channelIDs); err != nil {
|
||||
return fmt.Errorf("load tenant AI calls: %w", err)
|
||||
}
|
||||
if err := deleteTenantAIRows(tx, channelIDs, callIDs); err != nil {
|
||||
if err := deleteTenantAIRows(tx, channelIDs); err != nil {
|
||||
return err
|
||||
}
|
||||
result.channelsGone = true
|
||||
@@ -253,22 +252,19 @@ func lockedAiChannelIDs(tx *gorm.DB, id uint) ([]uint, error) {
|
||||
return ids, err
|
||||
}
|
||||
|
||||
func lockedAiCallIDs(tx *gorm.DB, channelIDs []uint) ([]uint, error) {
|
||||
// lockAiCallRows 对租户渠道的全部调用日志行加 FOR UPDATE 锁(SQLite 忽略,
|
||||
// MySQL/PG 阻塞并发写入);调用日志可达数万,ID 不回传拼接 SQL,
|
||||
// 内容日志删除用子查询,避免绑定变量上限。
|
||||
func lockAiCallRows(tx *gorm.DB, channelIDs []uint) error {
|
||||
var rows []model.AiCallLog
|
||||
err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).Select("id").
|
||||
return tx.Clauses(clause.Locking{Strength: "UPDATE"}).Select("id").
|
||||
Where("channel_id IN ?", channelIDs).Order("id").Find(&rows).Error
|
||||
ids := make([]uint, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
ids = append(ids, row.ID)
|
||||
}
|
||||
return ids, err
|
||||
}
|
||||
|
||||
func deleteTenantAIRows(tx *gorm.DB, channelIDs, callIDs []uint) error {
|
||||
if len(callIDs) > 0 {
|
||||
if err := deleteWhere(tx, &model.AiContentLog{}, "call_log_id IN ?", callIDs); err != nil {
|
||||
return fmt.Errorf("delete tenant AI content logs: %w", err)
|
||||
}
|
||||
func deleteTenantAIRows(tx *gorm.DB, channelIDs []uint) error {
|
||||
callIDs := tx.Model(&model.AiCallLog{}).Select("id").Where("channel_id IN ?", channelIDs)
|
||||
if err := deleteWhere(tx, &model.AiContentLog{}, "call_log_id IN (?)", callIDs); err != nil {
|
||||
return fmt.Errorf("delete tenant AI content logs: %w", err)
|
||||
}
|
||||
steps := []struct {
|
||||
name string
|
||||
|
||||
Reference in New Issue
Block a user