第10章 併發控制

2021-10-23 18:07:22 字數 2566 閱讀 3711

多個事務同時訪問共享的資料庫時,如何保證資料庫的一致性?

在多使用者dbs中,如果多個使用者同時對同一資料操作,稱為併發操作。

併發操作引發的問題

t1: r1(a) w1(a) r1(b) w1(b)

t2: r2(a) w2(a) r2(b) w2(b)

sc = r1(a) w1(a) r2(a) w2(a) r1(b) w1(b) r2(b) w2(b)

sa = r1(a) w1(a) r1(b) w1(b) r2(a) w2(a) r2(b) w2(b)

如果排程中一對連續操作是衝突的,則意味著如果它們的執行順序交換,則至少會改變其中乙個事務的最終執行結果

下面兩個序列結果不同。第乙個序列中,r2(b)讀的是b的新值;第二個序列中,r2(b)讀的是b的舊值。

r1(b) w1(b) r2(b) w2(b)

r1(b) r2(b) w1(b) w2(b)

下面兩個序列結果就是相同的。

r1(a) w1(a) r2(b) w2(b)

r1(a) r2(b) w1(a) w2(b)

優先圖用於衝突可串性的判斷

優先圖結構

事務讀寫資料前需要獲得該資料上的鎖。

事務釋放鎖後,將不再獲得任何鎖。

事務獲得資料的x鎖後才能對資料進行修改

如果資料被加了s鎖,那麼其他事務無法獲得該資料的x鎖,但是可以獲得s鎖。事務獲得資料的s鎖後,如果需要修改資料,需要通過update lock把s鎖公升級為x鎖

如果事務取得了資料r上的更新鎖,則可以讀r,並且可以在以後公升級為x鎖

單純的s鎖不能公升級為x鎖

如果事務持有了r上的update lock,則其它事務不能得到r上的s鎖、x鎖以及update鎖

如果事務持有了r上的s lock,則其它事務可以獲取r上的update lock

給乙個結點顯式加鎖時必須考慮

理論上要搜尋上面全部的可能情況,才能確定p上的鎖請求能否成功,顯然是低效的,因此引入意向鎖

ix鎖 intent exclusive lock,意向排他鎖,意向寫鎖

如果對某個結點加is(ix)鎖,則說明事務要對該結點的某個下層結點加s(x)鎖

對任一結點p加s(x)鎖,必須先對從根結點到p的路徑上的所有結點加is(ix)鎖

連線(會話)而設定的,不是針對乙個事務

不同隔離級別影響讀操作。

隔離級別

髒讀不可重複讀取

幻象未提交讀✔✔

✔提交讀✘✔

✔可重複讀✘✘

✔可序列讀✘✘

✘允許讀取當前頁面上的任何資料,不管是否已經提交。

事務不必等待任何鎖,也不需要對讀取的資料加鎖。

實際dbms中一般不使用。

保證事務不會讀取到其他未提交事務所修改的資料(可防止髒讀)

事務必須在所訪問資料上加s鎖,資料一旦讀出,就馬上釋放持有的s鎖

保證事務在事務內部如果重複訪問同一資料(記錄集),資料不會發生改變。即,事務在訪問資料時,其他事務不能修改正在訪問的那部分資料

可重複讀可以防止髒讀和不可重複讀取,但不能防止幻像

事務必須在所訪問資料上加s鎖,防止其他事務修改資料,而且s鎖必須保持到事務結束

保證事務排程是可串化的

事務在訪問資料時,其他事務不能修改資料,也不能插入新元組

事務必須在所訪問資料上加s鎖,防止其他事務修改資料,而且s鎖必須保持到事務結束

事務還必須鎖住訪問的整個表

1.等待-死亡

t請求乙個被u持有的鎖

2. 傷害-等待

t請求乙個被u持有的鎖

操作之前先加鎖,操作完釋放鎖,無法避免死鎖。適合寫頻繁的應用場景

操作之前不加鎖,只有寫提交時才檢查是否發生了寫衝突。適合讀頻繁的應用場景

oracle 第10章 控制檔案

2015 10 19 目錄 一 檢視控制檔案位置 二 檢視控制檔案內容 三 移動控制檔案 四 備份和恢復控制檔案 一 檢視控制檔案位置 二 檢視控制檔案內容 三 移動控制檔案 方法一 修改pfile init.ora 檔案移動控制檔案 rw r r 1 oracle oinstall 7.3k oc...

第7章 Linux併發控制 完成量

7.8 完成量 linux提供了完成量 completion,完成量 完成量用於乙個執行單元等待另乙個執行單元執行完某事。linux中與完成量相關的操作主要有以下4種。include 1.定義完成量 定義名為my completion的完成量 struct completion my complet...

第7章 Linux併發控制 訊號量

7.6 訊號量 訊號量 semaphore 是作業系統中最典型的用於同步和互斥的手段,訊號量的值可以是0 1或者n。訊號量與作業系統中的經典概念pv操作對應。p s 將訊號量s的值減1,即s s 1 如果s 0,則該程序繼續執行 否則該程序置為等待狀態,排入等待佇列。v s 將訊號量s的值加1,即s...