第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何避免 GORM 中的競爭條件

如何避免 GORM 中的競爭條件

Go
皈依舞 2022-08-09 20:45:00
我正在開發(fā)一個系統(tǒng),以啟用具有增量隊列編號的患者注冊。我正在使用Go,GORM和MySQL。當(dāng)多個患者同時注冊時,就會發(fā)生一個問題,他們往往會得到相同的隊列編號,這不應(yīng)該發(fā)生。我試圖使用事務(wù)和鉤子來實(shí)現(xiàn)這一點(diǎn),但我仍然得到重復(fù)的隊列編號。我沒有找到任何關(guān)于如何在事務(wù)發(fā)生時鎖定數(shù)據(jù)庫的資源。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}
查看完整描述

1 回答

?
炎炎設(shè)計

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個贊

正如 @O. Jones 所說,事務(wù)不會在這里保存你,因?yàn)槟阏谔崛×械淖畲笾?,?db 之外遞增它,然后保存該新值。從數(shù)據(jù)庫的角度來看,更新的值與查詢的值無關(guān)。


您可以嘗試在單個查詢中執(zhí)行更新,這將使依賴關(guān)系變得明顯:


UPDATE patient AS p

JOIN (

  SELECT max(queue_number) AS queue_number FROM patient WHERE registration_id = ?

) maxp

SET p.queue_number = maxp.queue_number + 1 

WHERE id = ?

在 gorm 中,您無法運(yùn)行這樣的復(fù)雜更新,因此您需要使用 .Exec


我不能100%確定上述內(nèi)容是否有效,因?yàn)槲也惶煜ySQL事務(wù)隔離保證。


更清潔的方式

總體而言,使用原子更新的計數(shù)器保留隊列表(按reference_id)會更干凈:


開始交易,然后


SELECT queue_number FROM queues WHERE registration_id = ? FOR UPDATE;

遞增應(yīng)用代碼中的隊列編號,然后


UPDATE queues SET queue_number = ? WHERE registration_id = ?;

現(xiàn)在,您可以在事務(wù)提交之前在患者創(chuàng)建/更新中使用遞增的隊列編號。


查看完整回答
反對 回復(fù) 2022-08-09
  • 1 回答
  • 0 關(guān)注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號