資料庫 併發控制與鎖機制

2021-10-04 07:29:54 字數 2010 閱讀 5547

事務隔離級別

資料庫中的事務是併發操作的,併發操作可以提高系統的工作效率,節省資源。在事務併發操作時,會出現多個事務對某一資源的爭用,多個事務對資源進行不同的操作,若不加以控制,會出現資料不一致的問題。因此,在dbms中需要進行併發控制管理。

若不對併發事務進行控制,會出現資料不一致的問題,如髒讀、不可重複讀、幻讀、丟失更新等問題。

髒讀多個事務併發執行,訪問共享資料,其中乙個事務讀取了被另乙個事務修改的共享資料,但修改資料的那個事務發生了錯誤,並沒有提交事務,此時讀取的資料就是髒資料(未提交的修改資料)。

不可重複讀

多個事務併發執行時,一些事務對共享資料進行多次讀操作,但其中一些事務對共享資料進行了修改或刪除操作,導致原有資料改變或丟失。

幻讀多個事務併發執行時,其中乙個事務對共享資料進行了新增操作,導致讀兩次時,第二次資料比第一次資料新增了一些資料。

丟失更新

多個事務併發執行時,其中乙個事務對共享資料進行了更新,並改變了前面事務的更新值,導致乙個事務對共享資料進行更新,但查詢的資料和更新的值不一致。

在dbms中,鎖表機制與併發控制排程器結合,實現共享資源的鎖定訪問。

根據鎖定資源型別鎖可分為:

另外鎖機制還可以運用在多種粒度上,如資料庫、表、頁面、行。鎖定的範圍越大,dmbs管理越容易。

當多個事務對共享資源進行加鎖時,操作是否成功,取決於鎖之間的相容性。

型別排他鎖

共享鎖無鎖

排他鎖否否是

共享鎖否是是

無鎖是是是

加鎖協議規定了何時使用排他鎖和共享鎖,何時釋放鎖。不同規則的加鎖協議,解決的資料庫一致性問題是不同的。

加鎖協議級別

排他鎖共享鎖

不丟失更新

不髒讀可重複讀

一級全程加鎖不加是

否否二級全程加鎖

開始時加鎖,讀完資料釋放鎖定是是

否**全程加鎖

全程加鎖是是

兩階段鎖定協議指的是所有併發事務在進行共享資料操作處理時,必須按照兩個階段(增長、縮減)對共享資料進行加鎖和解鎖申請。在增長階段,事務可以對共享資料進行加鎖申請,但不能釋放已有的鎖定;在縮減階段,事務可以對已有的鎖定進行釋放,但不能對共享資料提出新的加鎖申請。

在併發事務執行中,若所有事務都遵從兩階段鎖定協議,即可保持資料一致性。

在事務併發執行中,若事務同時鎖定兩個及以上資源時,可能會出現彼此都不能繼續執行的狀態,即死鎖狀態。

出現死鎖的必要條件

(1)互斥條件:事務對所分配的資源加排他鎖,在一段時間內某資源只由乙個事務占用;

(2)請求和保持條件:事務已經保持了至少乙個資源,但又提出新的資源請求,但該資源被其他資源占用,此時請求事務被阻塞,又不釋放已占用資源;

(3)不剝奪條件:事務占用已獲得資源,在未使用完前,不能被剝奪,只能在使用完時自動釋放;

(4)環路等待條件:事務t0在等待事務t1占用的資源,事務t1在等待事務t2占用的資源,依此類推,事務tn在等待事務t0占用的資源,造成環路等待。

解決方式

(1)在併發事務執行之前,預防死鎖;

(2)在死鎖出現後,其中乙個事務釋放資源解除死鎖。

這些是資料庫系統採用的兩種策略用於解決死鎖。

為了避免在事務併發時,出現讀髒資料、不可重讀、幻讀等問題,可以在dbms中設定隔離級別來避免出現事務併發帶來的問題。

隔離級別

髒讀不可重複讀

幻讀丟失更新

讀取未提交(read uncommitted)

可能可能

可能可能

讀取已提交(read committed)

不可能可能

可能可能

可重複讀 (repeatable read)

不可能不可能

可能可能

可序列化(serializable)

不可能不可能

不可能不可能

資料庫併發的問題與鎖機制

資料庫鎖機制 共享鎖排他鎖 更新鎖排他鎖 獨佔鎖,exclusive locks 意向鎖 intent locks 計畫鎖 schema locks ddl語句都會加sch m鎖該鎖不允許任何其它session連線該錶。連都連不了這個表了,當然更不用說想對該錶執行什麼sql語句了。requested...

Mysql鎖機制與併發控制

鎖是計算機協調多個程序或純執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算資源 cpu ram i o 的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所在有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。從這個角度來說,鎖對資料...

mysql併發控制之資料庫鎖

1.mysql和redis的區別 mysql是一種關係型資料庫,資料會最終儲存在磁碟上。而redis是一種非關係型的nosql資料庫,以key value的形式儲存資料,將資料儲存在記憶體。從效能上來說,redis將資料儲存在記憶體,性 能肯定要優於mysql資料庫。但是從安全的角度來說,mysql...