資料庫(2)資料庫鎖

2021-08-20 23:28:15 字數 2527 閱讀 1946

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。

二. 事物隔離等級和鎖的關係

網上很多部落格都是直接說了一連串的鎖,什麼悲觀鎖樂觀鎖,什麼讀寫鎖,什麼排他鎖共享鎖。說的不僅語焉不詳,而且分類紊亂,希望看到這篇文章能幫助你理清思路。

從鎖的實現方式來看,鎖可以分為悲觀鎖和樂觀鎖。

樂觀鎖:以樂觀的態度去預估併發操作中的資料衝突,不使用資料庫提供的鎖機制,而是通過資料庫使用者(程式設計師)新增某些欄位來實現鎖的機制,樂觀鎖不會真實的給資料上鎖,所以開銷較小。

悲觀鎖:悲觀鎖指的就是資料庫管理系統提供的鎖,之所以叫悲觀鎖,是因為這種鎖無論是否有併發衝突,都會給資料上鎖,因此開銷相對來說較大。

樂觀鎖的一種實現方式:

使用版本號時,可以在資料初始化時指定乙個版本號,每次對資料的更新操作都對版本號執行+1操作。並判斷當前版本號是不是該資料的最新的版本號。

select (status,status,version) from t_goods where

id=#

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

3.修改商品status為2

update t_goods set status=2,version=version+1

where

id=# and version=#;

可以看出,如果版本號在事物a進行中,發生了改變(事物b更新了資料),那麼事物a就不能成功的修改資料,相當於加了一把鎖。

但是樂觀鎖不適合高併發的情況,因為有可能幾個事物同時讀取了同乙個版本號,然後同時進行了修改,這樣就會出現資料不一致問題。所以資料庫提供的悲觀鎖其實是必要的

從加鎖的機制上,悲觀鎖分為共享鎖和排他鎖,共享鎖又叫讀鎖,排他鎖又叫寫鎖

共享鎖和排他鎖時資料庫管理系統提供的資料鎖,因此屬於據悲觀鎖。

共享鎖:共享鎖常用於讀取資料時,某使用者(事物)對資料加共享鎖以後,其他使用者(事物)只能對該資料加共享鎖,無法加排他鎖。排他鎖:排他鎖常用於寫資料時,某使用者(事物)對資料加排他鎖以後,其他使用者(事物)不能再對該資料加任何鎖,只能等到解鎖以後才可以繼續加鎖。

需要說明的是,在資料庫管理系統中,所有的寫操作都需要加排他鎖,而讀操作可以選擇加共享鎖,排他鎖,也可以不加鎖。因此乙個加了共享鎖的讀操作,會導致其他事物無法修改這個讀的資料。(這也就是serializable級別的實現方式)

在mylsql中,如果select操作加共享鎖:

select * from table_name lock

in share moed;

如果select操作加排他鎖:

select * from table_name for

update;

首先要說明的是,無論是行級鎖還是表級鎖,都是資料庫管理系統實現悲觀鎖的一種方式,也就是說共享鎖和排他鎖可以是行級也可以是表級。

表級鎖:加鎖時整個表都鎖定,整個表的內容都無法被修改,直到解鎖為止。這種鎖因為鎖的粒度較大,所以發生衝突的可能性較高,併發性低,但同時出現死鎖的概率也相對較低。

行級鎖:加鎖時只有某行資料被鎖定,而表內其他行不加鎖,可以被修改和訪問。這種鎖發生衝突的概率較低,併發性較高,但是出現死鎖的概率相對來說較高。

mysql有些資料庫引擎還提供了頁級鎖,但這些都是dbms特異性的功能,在此就不表述。

從理論上來說,事物的隔離等級都是通過資料庫鎖來實現的,但是又因為了mvcc機制出現,現代的資料庫管理系統對於事物隔離等級的實現並不同。因此在這裡只簡單說明一下他們的關係。

對於資料庫管理系統(mysql,sqlserver和oracle)來說,所有的寫操作(insert,update,delete),都是要加排他鎖的,根據排他鎖的性質我們可以得知,排他鎖未解鎖之前,不能再加排他鎖,這樣就保證了併發情況下的資料一致性。

因此在所有事物隔離等級中,寫操作未提交之前,其他事物對於該資料的寫操作都無法進行,因為該資料已經鎖定。

要多說一點的說,資料庫管理系統對於寫操作時鎖的粒度是有不同的,以mysql來說,對於innodb引擎,對於索引的資料進行寫操作,會使用行級鎖,但是如果這個資料沒有索引,還是會對全表加鎖。

根據前面我所說的,事物其實主要針對資料庫的寫操作,而mysql中事物寫操作加鎖的情況,僅僅出現在serilizable等級下,這種事物隔離等級下,讀操作加共享鎖寫操作加排他鎖。

其他隔離等級下的select操作是不會加鎖的,因為mysql有一種讀快照(snapshot read)的機制,也就是說其實普通的讀操作不會真正讀取到資料庫中的內容,而是讀取了乙個版本的快照,只有加鎖讀(共享鎖還有排他鎖都可以),才是讀取資料庫當前儲存的內容。

資料庫筆記2 鎖

1 互斥鎖 當有乙個執行緒要訪問共享資源 臨界資源 之前,會對執行緒訪問的這段 臨界區 進行加鎖。如果在加鎖之後沒釋放鎖之前其他執行緒要對臨界資源進行訪問,則這些執行緒會被阻塞睡眠,直到解鎖,如果解鎖時有乙個或者多個執行緒阻塞,那麼這些鎖上的執行緒就會變成就緒狀態,然後第乙個變為就緒狀態的執行緒就會...

mysql資料庫鎖 MySQL資料庫的鎖機制

在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。鎖分類 按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯...

資料庫鎖和資料庫隔離級別

最近突然發現忘了資料庫鎖和資料庫隔離級別,時常弄混它們之間的關係。為此特此寫下此部落格,以方便自己複習,同時也可以幫助博友。資料庫鎖 資料庫鎖就是事務t在對某個資料物件 例如表 記錄等 操作之前,先向系統發出請求,對其加鎖。加鎖後事務t就對該資料物件有了一定的控制,在事務t釋放它的鎖之前,其它的事務...