pgsql事務與並發控制


事務與並發控制

  1. 事務的基本的概念和性質

ACID:

  • 原子性:一個事務要么全部執行,要么全部不執行

  • 一致性:執行事務的時候,數據庫從一個一致的狀態變更到另一個狀態

  • 隔離性: 確保在並發執行的時候,每個事務感覺不到其他事務在並發的執行

  • 持久性:一個事務完成之后,即使數據庫發生故障,他對數據庫的改變應該永久的保存在數據庫中。

  1. 並發引起的現象

    • 臟讀:一個事務讀取了第二個事務的已經修改但是未提交的數據

    • 不可重復讀:一個事務第一次讀取數據之后,被讀取的數據被另一個已提交的事務進行了修改,事務再次讀取這些數據時候發現數據已經被另外一個事務所修改,兩次查詢不一致

    • 幻讀:一個事務的兩次結果集記錄數不一致(特殊的不可重復讀)

  2. 事務隔離級別

Pgsql 中默認的為讀已提交

  • 讀未提交:所有事務可以看到其他未提交的事務的結果

  • 讀已提交:一個事務只能看到已經提交事務對關聯數據的影響

  • 可重復讀:確保同一個事務的多個實例在並發讀取數據時候,會看到同樣的數據行

  • 可序列化:強制進行事務排序,使得其互不沖突

  1. 查看數據庫的隔離級別操作

  • 查看全局事務級別

    select name,setting from pg_settings where name = 'default_transaction_isolation'
  • 修改全局事務隔離級別

    alter system set default_transaction_islation to 'REPEATABLE READ';
    select pg_reload_conf();
    select current_setting('transaction_isolation');
  • 查看當前會話的事務隔離級別

    show transaction_isolcation;
  • 設置當前事務的事務隔離級別

    start transaction isolation level READ UNCOMMITED;
    start TRANSACTION
    select xxxx
    END

並發控制

  1. 基於鎖的並發控制

    1. 排他鎖: 被加鎖的對象只能被持有鎖的事務的讀取和修改,其他事務無法在改對象上加其他鎖,也不能讀取和修改對象

    2. 共享鎖:被加鎖對象可以被鎖事務讀取,但是不能修改,其他事務可以在改對象上再加共享鎖

    3. 咨詢鎖(pg特有):

  2. 基於多版本的並發控制

    pgsql默認會加入以下幾個字段

    select xmin,xmax,cmin,cmax from test
    1. 以上四個字段保存了創建改行數據的事務xid,xmax保存的是刪除改行數據的xid

    • xmin、xmax:與事務對其他事務可見性相關,用於同一個事務可見性判斷

    • cmin、cmax:分別為用於插入和刪除該原組的時候在十五中的命令序列標識

  3. 判斷事務可見性

    • 1 如果xmax沒有值,改行對其他事務是可見的

    • 如果他被設置為回滾事務xid,則改行對其他事務也是可見的

    • 如果被設置為一個正在運行時,沒有commit和rollback的事務的xid,則改行對其他事務是可見的

    • 如果他被設置為一個已提交的事務的xid,該行在這個已提交的事務之后發起的所有事務都是不可見的

  4. 使用pg_repack解決表膨脹問題

    由於pg采用MVCC讀不阻塞寫,寫不阻塞讀,實現高性能和搞吞吐量。。但是也有不足的地方。如果對表進行大量的數據更新,則會導致其有兩個版本存在,一個為更新前,一個為更新后,導致其性能有影響。

    pg_repack是一個在線重建表和索引擴展。會在數據庫中建立一個和需要清理的目標表一樣的臨時表,將目標表中的數據復制到臨時表。

安裝:

yum install -y pg_repack10

創建擴展

create extension pg_repack

重建表

pg_repack -t table_name -j 2 -D -k -h host -u postgres -d dbname

 


免責聲明!

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



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