mysql實現樂觀鎖

2021-09-26 15:46:34 字數 727 閱讀 5553

當需要更新銷售中的商品數量(selling_amount)時,使用如下的sql語句:

update product_amount set selling_amount = #, version = # where id=# and version = #;

若該語句返回1,則表示更新成功;若返回0,則表示前後的version不一致,產生衝突,更新失敗

對於更新倉庫中的商品資料(storing_amount)時,也是同理

不過,這樣為每行記錄都統一設定乙個version欄位的樂觀鎖方式,存在乙個問題:上例中,如果同時需要單獨對selling_amount及storing_amount進行update(兩條sql語句分別單獨執行),那麼後執行的一條會因為先執行的一條更新了version欄位而失敗,而這種失敗顯然是沒有必要的,白白浪費了開銷

一種比較好的方式是為每個需要樂觀鎖的字段單獨設定版本號,例如對上例的改造:

create table product_amount (

id int not null primary key auto_increment,

product_name varchar(64) not null,

selling_amount int not null,

selling_version int not null,

storing_amount int not null,

storing_version int not null

mysql樂觀鎖實現 mysql樂觀鎖實現

在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 1.丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。2.髒讀 當乙個事務讀取其它完成...

mysql 樂觀鎖實現 mysql 樂觀鎖實現

一 為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 1.丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。2....

mysql 樂觀鎖實現

一 為什麼需要鎖 併發控制 在多使用者環境中,在同一時間可能會有多個使用者更新相同的記錄,這會產生衝突。這就是著名的併發性問題。典型的衝突有 1.丟失更新 乙個事務的更新覆蓋了其它事務的更新結果,就是所謂的更新丟失。例如 使用者a把值從6改為2,使用者b把值從2改為6,則使用者a丟失了他的更新。2....