PostgreSQL中提供多種機制保證數據完整性。例如約束、觸發器、事務和鎖管理等。html
PostgreSQL一個特色是併發控制機制,在維護一致性和完整性時,儘可能避免堵塞讀寫。sql
在PostgreSQL中,使用多版本併發控制(MVCC)維護數據一致性,相對於鎖定模型,多版本控制系統主要優勢是讀(檢索)數據和寫數據鎖請求不互相沖突,讀寫不互相阻塞。傳統數據庫,爲維護數據一致性和完整性,避免一個事務讀寫到其它併發事務更新所產生不一致數據,一般採用就會使用LOCK機制。付出成本就是,當鎖請求沒法被響應時,待處理請求必須進入等候隊列,甚至等待超時不被處理。數據庫
在平常數據庫操做中,通常狀況下咱們對於一組操做一般但願可以所有成功或失敗,即不容許部分紅功狀況發生。一組操做,要麼所有執行完畢,要麼徹底執行失敗,相似操做被稱爲事務。併發
數據庫管理系統(DBMS)中,事務(transaction)具備四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),合併縮寫爲ACID。.post
原子性是指事務是一個不可再分割工做單元,事務中所有操做要麼所有執行,要麼都不執行,若是中途出現錯誤,須要回滾已完成全部操做,讓數據恢復到未執行操做前狀態。設計
一致性是指在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。版本控制
對於併發事務,咱們不但願發生不一致狀況,根據產生不一致結果嚴重狀況,分爲髒讀、不可重複讀 、幻讀和序列化異常。postgresql
髒讀是一個事務讀取另外一個事務未完整提交時數據,該事務執行存在失敗可能性,數據有可能回滾到初始狀態,致使讀取錯誤數據,所以最不但願發生。htm
針對同一個數據,前一個事務內屢次查詢,因爲期間後一個事務同時在提交數據,前一個事務重複讀取後一個事務數據致使執行結果不一樣,即前一個事務執行結果不一致,出現不可重複讀,少數狀況下,可能會出現問題。隊列
幻讀是指執行兩個徹底相同查詢,第二次查詢所返回結果集與第一次查詢不相同,幻讀可能致使事務出現邏輯錯誤。
序列化異常是指成功提交一組事務執行結果與這些事務可串行執行結果不一致。
SQL標準定義四個級別事務隔離,分別是讀未提交(read uncommitted)、讀已提交(read committed)、可重複讀(repeatable read)和可串行化(serializable)。可串行化經過數據庫標準定義,保證併發和順序執行結果相同;其餘三個級別是經過現象定義的。
不一樣事物隔離級別行爲各不相同,讀未提交可能出現髒讀;讀未提交和讀已提交可能致使不可重複讀,讀未提交、讀已提交和重複讀可能致使幻讀。
PostgreSQL可使用命令設置任意一種事務隔離級別,實際上只有讀已提交和可串行化兩種。讀已提交是PostgreSQL中的默認隔離級別。
PostgreSQL支持兩段提交協議。兩段提交是2臺以上數據庫實現原子性關鍵技術。
PostgreSQL存在表級鎖和行級鎖。當執行查詢、插入、更新、刪除等操做時,首先須要獲取表級鎖,再獲取行級鎖。
死鎖是指兩個不一樣事務相互影響,致使兩個事務均沒法正常執行。例如2個事務操做2個不一樣表時存在兩個排斥鎖互相請求對方表排斥鎖,兩個事務均沒法正常執行。
當事務設計不嚴謹時,可能會致使鎖等待很嚴重,甚至出現死鎖,嚴重影響數據庫正常運行。
參考連接
http://www.jianshu.com/p/04b542aeebac
https://www.postgresql.org/docs/10/static/transaction-iso.html
參考書籍
PostgreSQL 修煉之道 從小工到專家 P203-P220