PostGreSQL 事務操作

2021-09-11 09:26:08 字數 2798 閱讀 7960

一、隔離問題及隔離級別

1、隔離問題:

a、髒讀:乙個事務讀到另乙個事務沒有提交的資料

b、不可重複讀:乙個事務讀到另乙個事務已提交的資料(update、delete:乙個事務重新執行查詢,發現資料因被另乙個已經提交的事務 update 操作而改變)

c、虛讀(幻讀):乙個事務讀到另乙個事務已提交的資料(insert:乙個事務重新執行查詢,發現查詢結果的集合因另乙個已提交事務的 insert 操作而改變)

2、隔離級別

a、read uncommitted:讀未提交。存在3個問題

b、read committed:讀已提交。解決髒讀,存在2個問題可以

postgresql、oracle預設:可以看到已提交的;第二個事務等第一事務提交後提交

(注:select看到的是select開始之前資料庫的快照)

c、repeatable read:可重複讀。解決:髒讀、不可重複讀,存在1個問題。

mysql:show global variables like 'tx_isolation';

mysql預設:看不到已提交的;第二個事務等第乙個事務提交後回滾(exception:concurrent update)

d、serializable :序列化。都解決,單事務(如redis的單執行緒)。

(注:select看到的是事務開始之前資料庫的快照)

3、sql標準允許的:4種隔離級別只定義了哪種現象不能發生,但是沒有定義哪種現象一定發生

隔離級別

髒讀幻讀

不可重複性讀取

讀未提交

可能可能

可能讀已提交

不可能可能

可能可重複讀

不可能可能

不可能可序列讀

不可能不可能

不可能

二、操作

1、linux客戶端進入:./psql -h localhost -p 5444 -u rimu rimu  進去後輸入密碼(./psql -h ip- p port -u 使用者名稱 資料庫名)

linux客戶端退出:quit

2、開啟事務:begin;

3、提交事務:commit;

4、檢視postgresql預設的隔離級別:show default_transaction_isolation;

5、檢視postgresql當前的隔離級別:show transaction_isolation; 

6、修改當前事務的隔離級別:set transaction isolation level 四種級別;

7、修改當前回話的隔離級別:set default_transaction_isolation = '四種級別';

三、測試

1、參考 postgresql事務處理與併發控制 :

2、官方文旦:

3、測試結果:

repeatable read

serializable

read committed

更新同一表中的同一資料

先後開啟事務a、b。a更新a,b更新a。後提交的會回滾:could not serialize access due to concurrent update

先後開啟事務a、b。a更新a,b更新a。後提交的會回滾:could not serialize access due to concurrent update

先後開啟事務a、b。a更新a(0.109 ms),b更新b(0.113 ms)。a和b都會commit成功(但b會等a執行成功且commit之後,b才會執行成功,最後b也提交)

更新同一表中的不同資料

先後開啟事務a、b。a更新a(0.197 ms),b更新b(0.202 ms)。a和b都會commit成功先後開啟事務a、b。a更新a(0.233 ms),b更新b(0.274 ms)。後提交的會回滾

error: could not serialize access due to read/write dependencies among transactions

detail: reason code: canceled on identification as a pivot, during commit attempt.

hint: the transaction might succeed if retried.

先後開啟事務a、b。a更新a(0.109 ms),b更新b(0.113 ms)。a和b都會commit成功

四、mvcc

1、參考資料:

2、insert操作 : begin--->insert--->將資料放在share_cache中,並標記為dirty(髒讀問題)--->commit--->將資料持久化到磁碟

3、select xmin,xmax,cmin,cmax,age(xmin),txid_current from dual;

說明:txid_courrent= 2^32 + xmin + age(xmin);

edb當前事務號= xmin+age(xmin)

edb當前事務號到達2^32時,回歸

已提交的事務之間是否可見比較的是xmin的大小

PostgreSQL的事務隔離分析

不懂的同學先補補概念 reference wiki 隔離級別 isolation levels 有四種隔離級別 昨天被問了乙個問題 當存在表test id int 並有id 1一條記錄,那麼以下兩種操作會有什麼行為 sessiona啟動事務後,sessionb做了更新id 2操作後,此時sessio...

postgresql常用操作

1 允許客戶端遠端訪問 在postgres主目錄下的data中比如 c program files postgresql 9.3 data postgresql 1 監聽任何位址訪問,修改連線許可權 listen addresses localhost 改為 listen addresses 2 啟...

PostgreSQL常用操作

postgresql是功能最接近oracle的開源資料庫,對標oracle 的sqlplus工具,在postgresql中也有乙個類似的命令列工具,就是psql,它允許你互動地鍵入sql或命令。cd bin 進入postgres目錄,一般的安裝目錄是在 usr local postgresql su...