我正在开发一个系统,以启用具有增量队列编号的患者注册。我正在使用Go,GORM和MySQL。
当多个患者同时注册时,就会发生一个问题,他们往往会得到相同的队列编号,这不应该发生。
我试图使用事务和钩子来实现这一点,但我仍然得到重复的队列编号。我没有找到任何关于如何在事务发生时锁定数据库的资源。
func (r repository) CreatePatient(pat *model.Patient) error {
tx := r.db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
err := tx.Error
if err != nil {
return err
}
// 1. get latest queue number and assign it to patient object
var queueNum int64
err = tx.Model(&model.Patient{}).Where("registration_id", pat.RegistrationID).Select("queue_number").Order("created_at desc").First(&queueNum).Error
if err != nil && err != gorm.ErrRecordNotFound {
tx.Rollback()
return err
}
pat.QueueNumber = queueNum + 1
// 2. write patient data into the db
err = tx.Create(pat).Error
if err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
皈依舞
炎炎设计
随时随地看视频慕课网APP
相关分类