一、隔離問題及隔離級別
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...