悲觀鎖 樂觀鎖 行級鎖 表級鎖

2021-07-30 16:36:00 字數 1144 閱讀 1385

更新丟失:新改的覆蓋先改的,開發中有三種方法解決

1、將事務級別提高到最高端別

transaction_serializable

操作雙方都要提公升級別;查詢使用共享鎖;更新使用更新鎖;一方查詢,一方更新,共享鎖和更新鎖會衝突;當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失

2、悲觀鎖(加的是表級鎖)

一方:查詢語句加 for update;

另一方:查詢語句加 

for update;

當進行更新語句的時候,另一方不能進行更新操作

3、樂觀鎖

更新語句設定版本號,在指定版本中更新資料

一方:update account set money=money-200,

version=version+1 where id=1 and version=0;

另一方操作同乙個版本號,則不能更新資料

另一方:update account set money=money+200,

如果更新多,查詢少,用悲觀鎖;反之,樂觀鎖

表級鎖,where

用的是非主鍵

行級鎖,where

用主鍵一般是id

如果用表級鎖,其他客戶將不能進行查詢操作,因此開發中記得用行級鎖

以mysql

為例,有索引並且使用了該索引當條件的時候就是行鎖,沒有索引的時候就是表鎖。

innodb 

的行鎖是在有索引的情況下

,沒有索引的表是鎖定全表的.

行級鎖,一般是指排它鎖

,即被鎖定行不可進行修改,刪除,只可以被其他會話select。行級鎖之前需要先加表結構共享鎖

。表級鎖,一般是指表結構共享鎖

鎖,是不可對該錶執行ddl

操作,但對dml

操作都不限制。

行級鎖之前需要先加表結構共享鎖

悲觀鎖 樂觀鎖 行級鎖 表級鎖

更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...

悲觀鎖 樂觀鎖 行級鎖 表級鎖

更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...

悲觀鎖 樂觀鎖 行級鎖 表級鎖

更新丟失 新改的覆蓋先改的,開發中有三種方法解決 1 將事務級別提高到最高端別 transaction serializable 操作雙方都要提公升級別 查詢使用共享鎖 更新使用更新鎖 一方查詢,一方更新,共享鎖和更新鎖會衝突 當雙方更新鎖,出現死鎖,程式會自動回滾一方操作,從而避免更新丟失 2 悲...