新聞中心
悲觀鎖(?Pessimistic Lock?),顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時候都認為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖,這樣別人想拿這個數(shù)據(jù)就會阻塞直到它拿到鎖。傳統(tǒng)的關系型數(shù)據(jù)庫里邊就用到了很多這種鎖機制,比如行鎖、表鎖、讀鎖、寫鎖等,都是在做操作之前先上鎖。

成都創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網站建設公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務,在本地打下了良好的口碑,在過去的10年時間我們累計服務了上千家以及全國政企客戶,如成都自上料攪拌車等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質量監(jiān)控加上過硬的技術實力獲得客戶的一致稱揚。
樂觀鎖(?Optimistic Lock?),顧名思義,就是很樂觀,每次去拿數(shù)據(jù)的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號等機制實現(xiàn)。樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量。
悲觀鎖使用
相關方法
func (m *Model) LockUpdate() *Model
func (m *Model) LockShared() *Model?gdb?模塊的鏈式操作提供了兩個方法幫助您在?SQL?語句中實現(xiàn)“悲觀鎖”??梢栽诓樵冎惺褂?LockShared?方法從而在運行語句時帶一把”共享鎖“。共享鎖可以避免被選擇的行被修改直到事務提交:
db.Model("users").Ctx(ctx).Where("votes>?", 100).LockShared().All();上面這個查詢等價于下面這條SQL語句:
SELECT * FROM `users` WHERE `votes` > 100 LOCK IN SHARE MODE此外你還可以使用?LockUpdate?方法。該方法用于創(chuàng)建?FOR UPDATE?鎖,避免選擇行被其它共享鎖修改或刪除:
db.Model("users").Ctx(ctx).Where("votes>?", 100).LockUpdate().All();上面這個查詢等價于下面這條SQL語句:
SELECT * FROM `users` WHERE `votes` > 100 FOR UPDATE?FOR UPDATE? 與 ?LOCK IN SHARE MODE? 都是用于確保被選中的記錄值不能被其它事務更新(上鎖),兩者的區(qū)別在于 ?LOCK IN SHARE MODE? 不會阻塞其它事務讀取被鎖定行記錄的值,而 ?FOR UPDATE?會阻塞其他鎖定性讀對鎖定行的讀?。ǚ擎i定性讀仍然可以讀取這些記錄,?LOCK IN SHARE MODE? 和 ?FOR UPDATE?都是鎖定性讀)。
這么說比較抽象,我們舉個計數(shù)器的例子:在一條語句中讀取一個值,然后在另一條語句中更新這個值。使用 ?LOCK IN SHARE MODE? 的話可以允許兩個事務讀取相同的初始化值,所以執(zhí)行兩個事務之后最終計數(shù)器的值+1;而如果使用 ?FOR UPDATE?的話,會鎖定第二個事務對記錄值的讀取直到第一個事務執(zhí)行完成,這樣計數(shù)器的最終結果就是+2了。
樂觀鎖使用
樂觀鎖,大多是基于數(shù)據(jù)版本 (Version)記錄機制實現(xiàn)。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個版本標識,在基于數(shù)據(jù)庫表的版本解決方案中,一般是通過為數(shù)據(jù)庫表增加一個?version?字段來實現(xiàn)。
讀取出數(shù)據(jù)時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表對應記錄的當前版本信息進行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當前版本號,則予以更新,否則認為是過期數(shù)據(jù)。
鎖機制總結
兩種鎖各有優(yōu)缺點,不可認為一種好于另一種,像樂觀鎖適用于寫比較少的情況下,即沖突真的很少發(fā)生的時候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個吞吐量。但如果經常產生沖突,上層應用會不斷的進行重試,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適。
網站標題:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈式操作-悲觀鎖&樂觀鎖
網站鏈接:http://www.5511xx.com/article/dphssip.html


咨詢
建站咨詢
