天天看點

對mysql樂觀鎖、悲觀鎖、共享鎖、排它鎖、行鎖、表鎖概念的了解

樂觀鎖

樂觀鎖是指操作資料庫時(更新操作),想法很樂觀,認為這次的操作不會導緻沖突,在操作資料時,并不進行任何其他的特殊處理(也就是不加鎖),而在進行更新後,再去判斷是否有沖突了。

實作:

通常實作是這樣的:在表中的資料進行操作時(更新),先給資料表加一個版本(version)字段,每操作一次,将那條記錄的版本号加1。也就是先查詢出那條記錄,擷取出version字段,如果要對那條記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,如果相等,則說明這段期間,沒有其他程式對其進行操作,則可以執行更新,将version字段的值加1;如果更新時發現此刻的version值與剛剛擷取出來的version的值不相等,則說明這段期間已經有其他程式對其進行操作了,則不進行更新操作。

舉例:

下單操作包括3步驟:

1.查詢出商品資訊

select (status,status,version) from t_goods where id=#{id}

2.根據商品資訊生成訂單

3.修改商品status為2

update t_goods 

set status=2,version=version+1

where id=#{id} and version=#{version};

悲觀鎖

悲觀鎖就是在操作資料時,認為此操作會出現資料沖突,是以在進行每次操作時都要通過擷取鎖才能進行對相同資料的操作,這點跟java中的synchronized很相似,是以悲觀鎖需要耗費較多的時間。另外與樂觀鎖相對應的,悲觀鎖是由資料庫自己實作了的,要用的時候,我們直接調用資料庫的相關語句就可以了。

說到這裡,由悲觀鎖涉及到的另外兩個鎖概念就出來了,它們就是共享鎖與排它鎖。共享鎖和排它鎖是悲觀鎖的不同的實作,它倆都屬于悲觀鎖的範疇。

排它鎖

排它鎖與共享鎖相對應,就是指對于多個不同的事務,對同一個資源隻能有一把鎖。

與共享鎖類型,在需要執行的語句後面加上for update就可以了

行鎖

行鎖,由字面意思了解,就是給某一行加上鎖,也就是一條記錄加上鎖。

比如之前示範的共享鎖語句

SELECT * from city where id = "1"  lock in share mode; 

由于對于city表中,id字段為主鍵,就也相當于索引。執行加鎖時,會将id這個索引為1的記錄加上鎖,那麼這個鎖就是行鎖。

表鎖

表鎖,和行鎖相對應,給這個表加上鎖。

MyISAM引擎裡有的,暫時研究了

---------------------

https://blog.csdn.net/puhaiyang/article/details/72284702