-
事務的基本的概念和性質
ACID:
-
原子性:一個事務要么全部執行,要么全部不執行
-
一致性:執行事務的時候,數據庫從一個一致的狀態變更到另一個狀態
-
隔離性: 確保在並發執行的時候,每個事務感覺不到其他事務在並發的執行
-
持久性:一個事務完成之后,即使數據庫發生故障,他對數據庫的改變應該永久的保存在數據庫中。
-
並發引起的現象
-
臟讀:一個事務讀取了第二個事務的已經修改但是未提交的數據
-
不可重復讀:一個事務第一次讀取數據之后,被讀取的數據被另一個已提交的事務進行了修改,事務再次讀取這些數據時候發現數據已經被另外一個事務所修改,兩次查詢不一致
-
幻讀:一個事務的兩次結果集記錄數不一致(特殊的不可重復讀)
-
-
事務隔離級別
Pgsql 中默認的為讀已提交
-
讀未提交:所有事務可以看到其他未提交的事務的結果
-
讀已提交:一個事務只能看到已經提交事務對關聯數據的影響
-
可重復讀:確保同一個事務的多個實例在並發讀取數據時候,會看到同樣的數據行
-
可序列化:強制進行事務排序,使得其互不沖突
-
查看數據庫的隔離級別操作
-
查看全局事務級別
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
並發控制
-
基於鎖的並發控制
-
排他鎖: 被加鎖的對象只能被持有鎖的事務的讀取和修改,其他事務無法在改對象上加其他鎖,也不能讀取和修改對象
-
共享鎖:被加鎖對象可以被鎖事務讀取,但是不能修改,其他事務可以在改對象上再加共享鎖
-
咨詢鎖(pg特有):
-
-
基於多版本的並發控制
pgsql默認會加入以下幾個字段
select xmin,xmax,cmin,cmax from test
-
以上四個字段保存了創建改行數據的事務xid,xmax保存的是刪除改行數據的xid
-
xmin、xmax:與事務對其他事務可見性相關,用於同一個事務可見性判斷
-
cmin、cmax:分別為用於插入和刪除該原組的時候在十五中的命令序列標識
-
-
判斷事務可見性
-
1 如果xmax沒有值,改行對其他事務是可見的
-
如果他被設置為回滾事務xid,則改行對其他事務也是可見的
-
如果被設置為一個正在運行時,沒有commit和rollback的事務的xid,則改行對其他事務是可見的
-
如果他被設置為一個已提交的事務的xid,該行在這個已提交的事務之后發起的所有事務都是不可見的
-
-
使用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