修复会话安全与实时消息

This commit is contained in:
yml2213
2026-07-14 15:06:01 +08:00
parent 064af29d3b
commit 8cff2a5824
29 changed files with 1961 additions and 546 deletions
+34
View File
@@ -0,0 +1,34 @@
package model
import (
"errors"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
var ErrSessionNotFound = errors.New("会话不存在")
// CreateMessage 在会话行锁保护下分配消息序号,避免并发写入出现重复序号。
func CreateMessage(message *Message) error {
return DB.Transaction(func(tx *gorm.DB) error {
var session Session
if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).First(&session, message.SessionID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return ErrSessionNotFound
}
return err
}
var maxSeq int
if err := tx.Model(&Message{}).
Where("session_id = ?", message.SessionID).
Select("COALESCE(MAX(seq), 0)").
Scan(&maxSeq).Error; err != nil {
return err
}
message.Seq = maxSeq + 1
return tx.Create(message).Error
})
}