中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

postgresql事務處理與并發控制

發布時間:2020-05-21 11:20:22 來源:網絡 閱讀:2404 作者:一個笨小孩 欄目:數據庫

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查詢只能看到查詢開始之前已提交的數據,而無法看到未提交的數據或者在查詢執行期間其他事務已經提交的數據。

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


②:可串行化:

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

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

炉霍县| 南雄市| 桦南县| 和硕县| 镇江市| 鲁山县| 平潭县| 敦化市| 枣强县| 达日县| 郎溪县| 张掖市| 永新县| 榆林市| 永修县| 简阳市| 磐石市| 平邑县| 芷江| 盘锦市| 巨野县| 南部县| 天镇县| 宝山区| 乐山市| 资中县| 进贤县| 淮南市| 周宁县| 黑山县| 图片| 麦盖提县| 阿克苏市| 布尔津县| 石泉县| 韶关市| 绩溪县| 尉犁县| 靖宇县| 开远市| 灯塔市|