PostgreSQL事務隔離級別


一、概念

並發控制是多個事務在並發運行時,數據庫保證事務一致性(Consistency)和隔離性(Isolation)的一種機制。PostgreSQL使用了多版本並發控制技術的一種變體:快照隔離Sanpshot Isolation(簡稱SI)。通過SI,PostgreSQL提供了四個事務隔離級別,隔離級別從低到高分別是:Read uncommitted 、Read committed 、Repeatable read 、Serializable。在各個隔離級別上被禁止出現的現象是:

  • 臟讀:一個事務讀取了另一個並行未提交事務寫入的數據。
  • 不可重復讀:一個事務重新讀取之前讀取過的數據,發現該數據已經被另一個事務(在初始讀之后提交)修改。
  • 幻讀:一個事務重新執行一個返回符合一個搜索條件的行集合的查詢, 發現滿足條件的行集合因為另一個最近提交的事務而發生了改變。
  • 序列化:禁止所有並發異象,效果如同事務以串行的方式執行。

1、Read uncommitted

讀未提交,指的就是一個事務可以讀取另一個未提交事務的數據。

打個比方:你打算在網上買一台新的電腦,看到一家店中原價6000的電腦,現價只要998,沒錯,只要998。但是當你開開心心去付款的時候,價格又變成了6000,為啥呢?原來店家老板在輸入商品單價的時候(事務開始),不小心按錯寫成998了,但是事務還沒有提交,這時被你看見了,可老板及時發現了不對,馬上回滾差點就提交了的事務,將數字改成6000再提交。

小結:商品價格還是原先的6000,但是你卻看到了998。這是老板輸錯了還沒提交的數據,這就是臟讀。

那怎么解決臟讀呢?Read committed!讀提交,能解決臟讀問題。

2、Read committed

讀提交,就是指一個事務要等另一個事務提交后才能讀取數據。

打個比方:盡管你發現這台電腦不是998,而是6000,因為你很喜歡,所以咬咬牙還是決定用卡里最后的6000塊買下這台電腦。當你開始支付訂單時(事務開始),收費系統事先檢測到你的卡里有6000塊。但是當收費系統准備扣款時,再檢測卡里的金額,發現錢不夠了。你還在納悶為啥的時候,你收到一條短信:恭喜您成功續費xxx視頻的會員!原來你之前購買的xxx視頻的會員在這個時候自動續費了,扣掉了20塊,導致你沒錢買電腦了(第二次檢測金額就是等待會員續費轉出金額事務提交完)。

說明:這就是讀提交,若有事務對數據進行更新(UPDATE)操作時,讀操作事務要等待這個更新操作事務提交后才能讀取數據,可以解決臟讀問題。但在這個事例中,出現了一個事務范圍內兩個相同的查詢卻返回了不同數據,這就是不可重復讀。


3、Repeatable read

重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作。

舉例:你終於等到發工資了,這時你卡里有錢去買電腦了。當你支付訂單時(事務開啟,不允許其他事務的UPDATE修改操作),收費系統檢測到你卡里有6000塊,現在不允許其它事務從你的卡里扣錢了,你終於如願買到新電腦了。

說明:利用重復讀終於可以解決不可重復讀問題了。但是要注意的是:不可重復讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。

4、幻讀

買完電腦之后,你想看看今天的賬單,看看卡里還是多少錢。看到確實是花了6000元,還剩1000塊,就在這個時候,你的視頻會員又給你自動續費了,即新增INSERT了一條消費記錄,並提交。當你打印出自己的賬單時,發現卡里980了,怎么少了20塊,似乎出現了幻覺,這就是幻讀

5、序列化

Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。

二、操作

1、查詢postgreSQL默認的隔離級別:show default_transaction_isolation;也可以在數據庫級別設置默認的隔離級別:#default_transaction_isolation = 'read committed'

2、檢查當前隔離級別:show transaction_isolation;

3、修改當前事務的隔離級別,須在事物中執行:set transaction isolation level serializable;

4、修改當前會話默認的隔離級別:set default_transaction_isolation='repeatable read';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM