go orm如何多個協程並行更新一條記錄

2021-10-23 02:26:40 字數 789 閱讀 7577

最近遇到乙個問題,兩個go協程裡要同時更新同乙個記錄的不同字段(buy和sell)。踩了一天的坑,才找到正確的方式。

首先想到的是使用

o := orm.neworm()

·····

o.update(&rices)

但是發現會出現buy或者sell乙個為空的情況。

之後再這裡看到可以使用這種方式:

// 建立orm物件

o := orm.neworm(

)// 開始事務

o.begin()

// 開始執行各種sql語句,更新資料庫,這裡可以使用beego orm支援任何一種方式運算元據庫

// 例如,更新訂單狀態

_, err1 := o.querytable(

"orders"

).filter(

"id"

,1001).

update

(orm.params)

// 給使用者加積分

_, err2 := o.raw(

"update users set points = points + ? where username=?"

,"tizi365"

,100).

exec()

// 檢測事務執行狀態

if err1 != nil || err2 != nil else

但是這裡有個錯誤,update本身已經開啟事務了,所以要將上面的o.begin()和 o.commit(),o.rollback()幾個去掉才可以。

並行事務同時更新同一條記錄

程式大概 sql語句 首先除錯程式,等程式斷下來之後,在瀏覽器重新發起一次請求,模擬雙線程。這時除錯視窗有執行緒 ps 這裡用到的是mysql自帶的連線池 事務開始但還沒更新該記錄時,該行還未被鎖定,這是還可以更新 這時6號執行緒下一步就執行更新操作了 6號執行緒執行完之後,由於事務id為14的記錄...

MySQL一條語句更新多個表的方法

mysql本身是支援一條update語句更新多個表的,有時候這是非常有用的乙個特性。update low priority ignore table references set col name1 col name2 where where condition 於是繼續找table referen...

一條SQL更新語句是如何執行的

mysql create table t id int primary key,c int 如果要將id 2這一行的值加1,sql語句就會這麼寫 mysql update t set c c 1where id 2 執行語句前要先連線資料庫,這是聯結器的工作。在乙個表上有更新的時候,跟這個表有關的查...