我正在嘗試獲取和更新列并需要此過程是并發的。因此,我通過進行行級鎖定SELECT FOR UPDATE,然后進行計算,然后進行更新,所有這些都在具有隔離級別的事務中進行。repeatable read但是,這仍然不是預期的并發。此列只是一個隨機列,而不是主鍵或外鍵。之后我將其更改為樂觀鎖定并且有效但我試圖理解為什么這不起作用。我在下面同時運行了這段代碼多次,它的行為方式與我單獨運行它相同次數時的行為方式不同。_, err = s.xStore.ManageTransaction(func(ctx context.Context, tx *sqlx.Tx) (interface{}, error) { _, err := tx.Exec("set transaction isolation level repeatable read") if err != nil { return nil, err } c, err = s.xStore.GetForUpdate(x) //Some calculations _ = s.xStore.Update(c) return nil, nil }) return }()}這是我使用 FOR UPDATE 鎖定行的 Get 查詢。func (s *xStore) GetForUpdate(id string) (*model.X, error) { query := ` SELECT * FROM things where id = $1 FOR UPDATE` _, err := s.db.Exec(query, id) if err != nil { return nil, err } var x model.X err := s.db.Get(&x, query, id) err = s.db.Get(&x, query, id) if err != nil { return nil, err } return &x, nil}
1 回答

慕森王
TA貢獻1777條經驗 獲得超3個贊
您的代碼正在不同事務中執行查詢,創建新事務(db.BeginTx)或使用提供的方式,例如:
rows := tx.Query(你的查詢)
做一些計算
tx.ExecContext
tx.Commit
(參考 https://go.dev/doc/database/execute-transactions)
- 1 回答
- 0 關注
- 73 瀏覽
添加回答
舉報
0/150
提交
取消