大數據就業實戰培訓 Oracle就業實戰培訓
PostgreSQL從小白到專家,是從入門逐漸能力提升的一個系列教程,內容包括對PG基礎的認知、包括安裝使用、包括角色權限、包括維護管理、、等內容,希望對熱愛PG、學習PG的同學們有幫助,歡迎持續關注CUUG PG技術大講堂。
第20講:事務概述與隔離級別
內容1:ACID四大特性
內容2:PostgreSQL事務隔離級別
內容3:MVCC介紹
內容4:Clog與事務狀態
內容5:事務快照
內容6:可重復讀隔離級別特點
內容7:讀提交隔離級別特點
內容8:可串行化隔離級別特點
ACID概述
· ACID四大特性:
--> Atomicity(原子性):一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。
--> Consistency(一致性):在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的數據必須完全符合所有的預設規則,這包含數據的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
--> Isolation(隔離性):數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。
--> Durability(持久性):事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
PostgreSQL支持的事務隔離級別
· 下表描述了PostgreSQL實現的事務隔離級別
MVCC概述
· 事務id(txid)
并發控制是一種在數據庫中并發運行多個事務時保持一致性和隔離性的機制,這是ACID的兩個屬性。
并發控制技術:
--> 多版本并發控制(MVCC)
--> 嚴格的兩階段鎖(S2PL)
--> 樂觀并發控制(OCC)
· MVCC特點
每次寫操作都會創建數據項的新版本,同時保留舊版本。當事務讀取一個數據項時,系統會選擇其中一個版本以確保單個事務的隔離。MVCC的主要優點是“讀不阻止寫,寫不阻止讀,相反,例如,基于S2PL的系統必須在寫卡器寫入項時阻止讀卡器,因為寫卡器獲取項的獨占鎖。PostgreSQL和一些rdbms使用MVCC的一個變體,稱為快照隔離(Snapshot Isolation,SI)。
MVCC實現對比
· 事務id(txid)
PostgreSQL通過應用可見性檢查規則來選擇項目的適當版本
由于PostgreSQL數據塊中包含了未刪除和已刪除的行的數據,所以在讀取數據塊中行的時候,需要一套規則來判斷哪些行能夠被哪些事務所看得見,我們成為行可見性規則
Oracle使用回滾段來選擇項目的適當版本
Oracle專門創建了一個回滾表空間,用來存放修改前的行的數據,而表的數據塊中沒有包含刪除行的數據,所以不需要行可見性規則來判斷。
事務狀態
· Transaction Status
四種事務狀態:
--> IN_PROGRESS
--> COMMITTED
--> ABORTED
--> SUB_COMMITTED
Commit Log
· Clog 工作原理
事務快照
· 內置函數txid_current_snapshot及其文本表示格式
testdb=# SELECT txid_current_snapshot();
txid_current_snapshot
-----------------------
100:104:100,102
(1 row)
· txid_current_snapshot的文本表示為“xmin:xmax:xip_list”,組件描述如下
Xmin:最早仍在活動的txid。所有以前的事務要么提交并可見,要么回滾并停止。
Xmax:第一個尚未分配的txid。截至快照時,所有大于或等于此值的txid尚未啟動,因此不可見。
xip_list:快照時的活動txid。該列表僅包含xmin和xmax之間的活動txid。
例如,在快照'100:104:100,102'中,xmin是'100',xmax是'104',xip_list是'100,102'。
· Examples of transaction snapshot representation
事務管理器
· 不同隔離級別的事務快照狀態
并發UPDATE時
防止更新的數據丟失
· 并發UPDATE操作,隔離級別不同如何保護已修改的數據不丟失
1)如果A事務回滾,則b事務能夠更新成功
2)B事務如果查詢了表,則再次更新時失敗,如果沒有,則會更新成功
防止更新的數據丟失
· 讀提交事務隔離級別(事務A和B同時修改同一行)
· 可重復讀事務隔離級別(事務A和B同時修改同一行)
· 可重復讀事務隔離級別(事務B在提交前執行了查詢)
· 可重復讀事務隔離級別(事務B在提交前沒有執行查詢)
可串行化快照隔離
· SSI(可串行化快照隔離)實施的基本策略
寫入傾斜計劃及其優先級圖
· 在PostgreSQL中實現SSI
SIREAD locks:SIREAD鎖在內部稱為謂詞鎖,三個部分組成,由一對對象和(虛擬)txid 組成。
rw-conflicts:rw-conflicts是SIREAD鎖的三個組成部分中的一個和讀寫SIREAD鎖的兩個txid
· SSI 怎樣造成的
事務提交失敗的原因是要保護事務A修改的結果,因為事務B是在可串行化事務隔離級別,所以無法看到事務A修改后的結果
· 其它造成的場景
注意事務提交的不同順序
· 假陽性可串行化快照隔離異常
兩個事務分別查詢和更新各自的行,所以不會影響,都能夠提交成功。
· 假陽性可串行化快照隔離異常(1) – Using sequential scan
表沒有索引,導致順序掃描,兩個事務操作時發生交叉訪問同一個塊
· 假陽性可串行化快照隔離異常(2) – Index scan using the same index page
如果表比較小,導致root和leaf索引塊同屬于一個塊,兩個事務也發生交叉訪問同一個索引塊
· 假陽性可串行化快照隔離異常(3) – Index scan using the difference index page
插入新數據,導致root和leaf索引塊不屬于一個塊,不會造成交叉訪問
以上就是 第20講- 事務與隔離級別 的內容,歡迎一起探討交流,往期視頻,聯系cuug
QQ交流群:752027153
微信交流群:聯系客服拉你進微信PG交流群
釘釘交流群:35822460,釘釘群專門有視頻講解