1 回答

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)建/更新中使用遞增的隊列編號。
- 1 回答
- 0 關(guān)注
- 103 瀏覽
添加回答
舉報