postgresql交易處理與並發控制

來源:互聯網
上載者:User

標籤:選擇   完整   序列   過程   date   準備   版本   產生   計算   

postgresql交易處理與並發控制:

事務是postgresql中的基本工作單元,是使用者定義的一個資料庫操作序列。這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。

在postgresql中,交易管理員負責管理事務啟動並執行模組(模組有:鎖管理器和日誌管理器)

交易管理員是事務系統的中樞,通過接受資訊,處理下一步的事務操作。

 鎖管理器主要提供事務的寫階段並發控制所需的 各種鎖,從而保證事務的各種隔離等級。

 日誌管理器主要記錄事務執行的狀態和資料的變化過程。

事務開始後,事務中的所有操作都會寫到交易記錄中。寫到日誌中的事務一般有兩種:一種是針對資料的操作,如插入、修改和刪除,這些操作的對象是大量的資料;另一種是針對任務的操作,例如建立索引。當取消這些事務操作時,系統自動執行這種操作的反操作,保證系統的一致性。系統自動產生一個檢查點機制。這個檢查點周期地檢查交易記錄,如果在交易記錄中,事務全部完成,檢查點交易記錄中的事務就提交到資料庫 中,並且在交易記錄中做一個檢查點提交表示。如果在交易記錄中,事務沒有完成,檢查點就不會講交易記錄中的事務提交到資料庫中,並會在交易記錄中做一個檢查點未提交的標識。事務的恢複及檢查點保證了系統的完整和可恢複。


1、事務的屬性

   事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單位必須有4個屬性,即原子性、一致性、隔離性和持久性屬性,簡稱ACID屬性,只有這樣才能成為一個事務。

 原子性:事務必須是原子工作單元;對於資料修改,要麼全都執行,要麼全都不執行。

 一致性:事務在完成時,必須使所有的資料都保持一致。

 隔離性:由並發事務所做的修改必須與任何其他並發事務所做的修改隔離。事務識別資料時資料所處的狀態要麼是第二個並發事務修改之前的狀態,要麼是第二個事務修改之後的狀態,不會識別中間狀態的資料。這稱為可串列性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執行的狀態相同。

 持久性:事務完成之後,對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。

 

2、事務塊管理的常用語句:

   在postgresql裡,一個事務是通過把SQL命令用:begin 和 commit命令包圍實現的。事務塊是指包圍在begin 和 commit之間的語句。在postgresql9中,常用的事務塊管理語句的含義如下:

 start transaction:表示開始一個新的事務塊。

 begin:表示初始化一個事務塊 。

 commit:表示提交事務;

 rollback:表示事務失敗時執行復原操作。

 set transaction:設定當前事務的特性,對後面的事務麼有影響。


3、postgresql的並發控制

3.1、髒讀:

  當一個事務讀取的記錄時另一個事務的一部分時,如果第一個事務正常完成,就沒有什麼問題,如果此時另一個事務未完成,就會產生髒讀。


3.2、幻讀:

  當某一資料執行insert 或 delete操作,而該資料行恰好屬於某個事務正在讀取的範圍時,就會發生幻讀現象。比如在運行update語句的同時執行insert操作,因為插入了一個新記錄行,所以沒有鎖定,並且能夠珍惜。


3.3、不可重複性讀取:

  如果一個事務不止一次地讀取相同的記錄,但在兩次讀取中間有另一個事務剛好修改了資料,則兩次讀取的資料將出現差異,此時就發生了非重複讀取。


3.2、postgresql的交易隔離等級:


《隔離等級》   《髒讀》   《幻讀》   《不可重複性讀取》

讀未提交            可能          可能          可能

讀已提交           不可能        可能          可能

可重複讀           不可能        可能          不可能

可串列讀           不可能        不可能        不可能


   在postgresql裡,可以請求4種可能的交易隔離等級的任意一種。但是在內部,實際上只有兩種獨立的隔離等級,分別對應:讀已提交 和 可序列化。也就是說,如果選擇了讀未提交的層級,實際上使用的是讀已提交。在選擇可重複讀層級的時候,實際上用的是可序列化,所以實際的隔離等級可能比選擇的更嚴格。postgresql只提供兩種隔離等級的原因是:這是把標準的隔離等級與多版本並發控制架構映射相關的唯一合理方法。


postgresql中的兩種隔離等級如下:

①:讀已提交:

   讀已提交是postgresql裡的預設層級。當一個事務運行在這個隔離等級時,一個select查詢只能看到查詢開始之前已提交的資料,而無法看到未提交的資料或者在查詢執行期間其他事務已經提交的資料。

   如果兩個事務在對同一組資料進行更新操作,那麼第二個事務需要等待第一個事務提交或者更新復原。如果第一個事務進行提交,系統將重新計算查詢條件,符合條件後第二個事務繼續進行更新操作;如果第一個事務進行更新復原,那麼他的作業將被忽略,第二個事務將繼續更新最初發現的行。


②:可序列化:

   可序列化基本提供最嚴格的事務隔離。這個層級類比串列的事務執行,就好像事務將一個接著一個地串列(而不是並行)執行。不過,使用這個層級的應用必須準備在序列化失敗的時候重新啟動事務。

   如果兩個事務在對同一組資料進行更新操作,那麼序列化事務就將等待第一個正在更新的事務提交或復原。如果第一個事務提交了,那麼序列化事務將復原,從頭開始重新進行整個事務;如果第一個交易回復,那麼它的影響將被忽略,這個可序列化的事務就可以在該元祖上進行更新操作。


postgresql交易處理與並發控制

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.