數據庫相關知識整理(三)

數據庫事務

四個特性ACID

事務(Transaction)是由一系列對系統中數據進行訪問與更新的操作所組成的一個程序執行邏輯單元。事務是DBMS中最基礎的單位,事務不可分割。

事務具有4個基本特徵,分別是:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Duration),簡稱ACID。

事務:是一系列的數據庫操作,是數據庫應用的基本邏輯單位。
事務特性:
1)原子性:事務被視爲不可分割的最小單元,事物的所有操作要不成功,要不失敗回滾,而回滾可以通過日誌來實現,日誌記錄着事務所執行的修改操作,在回滾時反向執行這些修改操作。

2)一致性:數據庫在事務執行前後都保持一致性狀態,在一致性狀態下,所有事務對一個數據的讀取結果都是相同的。

3)隔離性:一個事務所做的修改在最終提交以前,對其他事務是可不見的。

4)持久性:一旦事務提交,則其所做的修改將會永遠保存到數據庫中。

事務的隔離級別

髒讀:髒讀是指在一個事務處理過程裏讀取了另一個未提交的事務中的數據。
不可重複讀:不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內多次查詢卻返回了不同的數據值,這是由於在查詢間隔,被另一個事務修改並提交了。
幻讀:幻讀是 A 事務讀取到 B 事務提交的新增數據,這時 A 事務將出現幻象讀的問題。
幻讀和不可重複讀是兩個容易混淆的概念,前者是指讀到了其他已經提交事務的新增數據,而後者是指讀到了已經提交了事務的更改數據(更改或刪除)。爲了避免這種情況,採取的對策不相同:防止讀到更改數據,只需要對操作的數據添加行級鎖,阻止操作中的數據發生變化;而防止讀到新增數據,則往往需要添加表級鎖——將整張表鎖定,防止新增數據。


Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
Read committed (讀已提交):可避免髒讀的發生。
Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

悲觀鎖:也即悲觀併發控制,Pessimistic Concurrency Controller,縮寫 PCC。悲觀鎖是指在數據處理過程,使數據處於鎖定狀態,一般使用數據庫的鎖機制實現。
悲觀鎖優缺點:悲觀併發控制(悲觀鎖)採用"先取鎖再分"的保守策略,爲數據處理提供了安全的保證。但在效率方面,加鎖機制會產生額外的開銷,增加產生死鎖的機會。
樂觀鎖:相對悲觀鎖來說,樂觀鎖是通過記錄數據版本的方式實現樂觀鎖。爲數據增加一個版本標識,讀取數據時,將版本標識一起讀出,數據沒更新一次,就對版本標識進行更新。

樂觀鎖優缺點:樂觀鎖認爲事務直接競爭的概率是很小的,在提交的時候才鎖定,所以不會產生死鎖。但是如果兩個事務同時讀取數據庫的某一行,這時,就會發現樂觀鎖的弊端。


行級鎖:行級鎖分爲共享鎖和排它鎖。行級鎖是 Mysql 中鎖定粒度最細的鎖。InnoDB引擎支持行級鎖和表級鎖,只有在通過索引條件檢索數據的時候,才使用行級鎖,否就使用表級鎖。行級鎖開銷大,加鎖慢,鎖定粒度最小,發生鎖衝突概率最低,併發度最高


表級鎖:表級鎖分爲表共享鎖和表獨佔鎖。表級鎖開銷小,加鎖快,鎖定粒度大、發生鎖衝突最高,併發度最低
頁級鎖:頁級鎖是 MySQL 中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。表級鎖速度快,但衝突多,行級衝突少,但速度慢。

所以取了折衷的頁級,一次鎖定相鄰的一組記錄。BDB 支持頁級鎖。開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。


排它鎖(exclusive locck) :排它鎖又叫寫鎖,如果事務 T 對 A 加上排它鎖,則其它事務都不能對 A 加任何類型的鎖。獲准排它鎖的事務既能讀數據,又能寫數據。


共享鎖(share lock) :共享鎖又叫讀鎖,如果事務 T 對 A 加上共享鎖,則其它事務只能對 A 再加共享鎖,不能加其它鎖。獲准共享鎖的事務只能讀數據,不能寫數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章