資料庫併發控制

2021-09-26 15:30:07 字數 3980 閱讀 2585

acid,是指在可靠資料庫管理系統(dbms)中,事務(transaction)所應該具有的四個特性:

a:原子性(atomicity):事務是乙個或多個行為**在一起組成乙個單獨的工作單元,事務中的動作要不都發生,要不都不發生.

c:一致性(consistent):即在事務開始之前和結束之後,資料庫的完整性約束沒有被破壞.

資料庫層面:在乙個事務執行前和執行後,資料會符合你設定的約束(例如unique約束,foreign key約束,check約束等)和觸發器設定.由資料庫進行保證.

業務層面:保持業務的一致性.需要由開發人員進行保證.

i:隔離性(isolation):指的是在併發環境中,事務之間互相影響的程度(即併發事務間資料的可見程度).當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間.由併發事務所做的修改必須與任何其他併發事務所做的修改隔離.事務檢視資料更新時,資料所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視到中間狀態的資料. 

d:永續性(durability):一旦事務完成,事務的結果應該持久化,用來保證即使系統崩潰也不會破壞事務的結果.

我們通過視覺化介面對不同的資料庫進行管理,不可避免要實現多個程序訪問資料庫同一資料,或者修改同一資料。不得不提到資料庫利用加鎖和阻塞來保證事物之間不同等級的隔離性,從而實現事務的互不干擾的訪問和運算元據庫.

干擾資料的隔離性的四大問題:

no.1 丟失修改(丟失更新 ps:反正叫什麼的都有)

如果兩個事務都要更新資料庫乙個欄位x,x=100;

事務a事務b

讀取x=100 

讀取x=100

寫入x=x+100

寫入x=x+200

事務結束x=200 

事務結束x=300

最後x=300

兩個不同的事務同時獲得了相同的資料,又都對這個資料進行了修改,那麼先提交的事務的更新就會被後提交事務的更新覆蓋掉.叫做丟失更新.

no.2 髒讀(讀髒資料 未提交讀)

事務a事務b

寫入x=x+100 (x=200)

讀取x=200 (讀取了事務b未提交的資料)  

事務回滾x=100 

事務結束x=100

事務結束

事務讀取了未提交的資料,如圖 事務b可能出現未提交或者提交不成功的情況而進行回滾,這就導致事務a讀取了錯誤的資料,也叫髒資料.

no.3 不可重複讀

乙個事務執行期間,在自己沒有更新資料庫的情況下,同乙個查詢操作在執行一次或多次的情況下,結果應該是一致的.

事務a事務b

讀取x=100

讀取x=100

讀取x=100 

寫入x=x+100

事務結束, x=200

讀取x=200

(此時,在同乙個事務a中,讀取的x值發生了變化!)

事務結束

這種情況事務a多次讀取資料出現不一致的結果.

摘自薩師煊老師的資料庫系統概論的解釋:不可重複讀包括三種情況(這裡列舉第一種情況 因為後兩種情況也稱為幻影現象):

(1):事務t1讀取某一資料之後,事務t2對其進行了修改,當事務t1再次讀該資料時,得到與前一次不同的值.如上所示

no.4 幻讀(幻影現象)

這個問題可有意思了,很多博主說他跟不可重複讀有相似的地方,我認為這樣更容易讓讀者混淆.資料庫書中說的幻影現象就是不可重複讀情況中的兩種.

(2):事務t1按一定條件從資料庫中讀取了某些資料記錄後,事務t2刪除了其中部分記錄,當t1再次按照相同條件讀取資料時,發現某些記錄神秘的消失了.

(3):事務t1按一定條件從資料庫中讀取了某些資料記錄後,事務t2插入了一些記錄,當t1再次按照相同條件讀取資料時,發現多了一些記錄.

知乎大佬的例子:

users: id 主鍵

1、t1:select * from users where id = 1;

2、t2:insert into `users`(`id`, `name`) values (1, 'big cat');

3、t1:insert into `users`(`id`, `name`) values (1, 'big cat');

t1 :主事務,檢測表中是否有 id 為 1 的記錄,沒有則插入,這是我們期望的正常業務邏輯。

t2 :干擾事務,目的在於擾亂 t1 的正常的事務執行。

在 rr(這裡摘自知乎某位大佬的回答 我也不曉得rr是什麼東東) 隔離級別下,1、2 是會正常執行的,3 則會報錯主鍵衝突,對於 t1 的業務來說是執行失敗的,這裡 t1 就是發生了幻讀,因為t1讀取的資料狀態並不能支援他的下一步的業務,見鬼了一樣。

所以 mysql 的幻讀並非什麼讀取兩次返回結果集不同,而是事務在插入事先檢測不存在的記錄時,驚奇的發現這些資料已經存在了,之前的檢測讀獲取到的資料如同鬼影一般

這裡要靈活的理解讀取的意思,第一次select是讀取,第二次的 insert 其實也屬於隱式的讀取,只不過是在 mysql 的機制中讀取的,插入資料也是要先讀取一下有沒有主鍵衝突才能決定是否執行插入。

不可重複讀側重表達 讀-讀,幻讀則是說 讀-寫,用寫來證實讀的是鬼影。

大佬的最後一句話:不可重複的側重表達讀-讀,幻讀則是說讀-寫.  emmmm....

在講隔離級別之前複習一下封鎖的知識.

封鎖是實現併發控制的乙個非常重要的技術.基本的封鎖型別有兩種:排他鎖(x鎖)共享鎖(s鎖);

排它鎖又稱寫鎖,若事務t對資料物件a加上x鎖,則只允許t讀取和修改a,其他任何事務都不能再對a加任何型別的鎖直到t釋放a上的鎖為止.

共享鎖又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事物只能再對a加s鎖,而不能加x鎖.

在運用 排他鎖 和 共享鎖 對資料物件加鎖時,還需要約定一些規則,例如何時申請 排他鎖 或 共享鎖、持鎖時間、何時釋放等。稱這些規則為封鎖協議(locking protocol)。對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議。不同的封鎖協議對應不同的隔離級別

在標準sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同:

a.  未授權讀取(read uncommited):允許髒讀取,但不允許丟失修改。

對應一級封鎖協議:一級封鎖協議是:事務t在修改資料r之前必須先對其加x鎖,直到事務結束才釋放。事務結束包括正常結束(commit)和非正常結束(rollback)。 

b.  授權讀取(read committed):允許不可重複讀取,但不允許髒讀取和丟失修改。這可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。

對應二級封鎖協議:二級封鎖協議是:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,讀完後即可釋放s鎖(瞬間s鎖)。

c.  可重複讀取(repeatable read):禁止不可重複讀取和髒讀取和丟失修改,但是有時可能出現幻影資料。這可以通過「共享讀鎖」和「排他寫鎖」實現。

對應**封鎖協議:**封鎖協議是:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,直到事務結束才釋放

d.  序列化(serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,但不能併發執行。

四級封鎖協議是對**封鎖協議的增強,其實現機制也最為簡單,直接對事務中所讀取或者更改的資料所在的表加表鎖,也就是說,其他事務不能讀寫該表中的任何資料。這樣所有的髒讀,不可重複讀,幻讀,都得以避免!

我真是日了 好多部落格連一級封鎖協議都不一樣哈 有加排他鎖的,有加共享鎖的. 我就是按照書上的加排他鎖吧.

併發控制有四個問題,也有五個問題的......

我就按照我的這想法吧 畢竟說法那麼多 p313附近有這個知識點.有疑問就去查 

分類: 資料庫

資料庫併發控制

資料庫併發控制 1 在資料庫中為什麼要併發控制?答 資料庫是共享資源,通常有許多個事務同時在執行。當多個事務併發地訪問資料庫時就會產生同時讀取和 或修改同一資料的情況。若對併發操作不加控制就可能會訪問和儲存不正確的資料,破壞資料庫的一致性。所以資料庫管理系統必須提供併發控制機制。2 併發操作可能會產...

資料庫併發控制

資料庫是乙個資源庫,可以供多個使用者使用.允許多個使用者同時使用同乙個資料庫的資料庫系統稱為多使用者資料庫系統.例如飛機訂票資料庫系統 銀行資料庫系統.在多使用者資料庫系統中同乙個時刻會有很多個併發執行的事務.1.提高吞吐量和資源利用率 乙個事務由多個步驟組成,一些步驟涉及i o活動,另一些涉及cp...

資料庫併發控制技術

事務是一系列的資料庫操作,是資料庫應用程式的基本邏輯單元,也是恢復和併發控制的基本單位。事務處理技術主要包括資料庫恢復技術和併發控制技術。本篇博文主要總結下併發控制技術。事務 是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的工作單位。例如,在關聯式資料庫中,乙個事務可...