oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介
作者:甘植懇-Aken
PostgreSQL和Oracle、MySQL等RDBMS一樣,都有自己的并發(fā)控制機制。而并發(fā)控制的目的是為了在多個事務同時運行時保持事務ACID屬性。
MVCC即Multi-version concurrence control首字母縮寫,MVCC會為每個數據更改操作創(chuàng)建數據塊或數據行的新版本,同時保留舊版本,主要優(yōu)點是:
'readers don't block writers,and writers don't block readers'
即“讀不會阻塞寫,而寫也不會阻塞讀”。
在Oracle中,多版本控制MVCC通過回滾段實現,當行記錄row發(fā)生更改的時候,先將數據塊的舊版本將寫入回滾段,隨后將新數據覆寫入原data block數據塊區(qū)域。在讀取數據的時候,通過比對scn來讀取合適的數據版本。
Oracle 19C Read Consistency in the Read Committed
相對Oracle來說,PostgreSQL的MVCC則使用更簡單的方法來實現。當行記錄tuple發(fā)生更改時候,新數據直接插入到原來的data page中。在讀取數據的時候,PostgreSQL通過可見性規(guī)則讀取合適的數據版本。
Transaction ids in PostgreSQL
簡單來說,PostgreSQL和Oracle在MVCC的實現上存在以下主要區(qū)別:
Oracle:基于SCN,塊級別,循環(huán)undo segment實現,支持閃回功能,存在大事務回滾、快照過舊ORA-01555問題。
PostgreSQL:基于事務編號txid,行級別,無需undo,不支持閃回,大事務可瞬間回滾,存在數據塊(data page)空間及性能消耗問題。
值得提出的是,去年Oracle中出現的SCN最大值預警問題,在PostgreSQL中通過txid循環(huán)復用來規(guī)避。
Oracle查看當前scn:
SQL> select current_scn from v$database;CURRENT_SCN-------------------- 698823298SQL>PostgreSQL查看當前事務ID:
(postgres@[local]:5432)[akendb01]#select txid_current(); txid_current -------------- 636(1 row)--查看行記錄tuple 1的txid:
(postgres@[local]:5432)[akendb01]#insert into table01 values(1,'aken01');INSERT 0 1(postgres@[local]:5432)[akendb01]#select id,name, ctid,xmin,xmax from public.table01; id | name | ctid | xmin | xmax ----+--------+-------+------+------ 1 | aken01 | (0,1) | 636 | 0上面insert插入行記錄Tuple 1,即id=1,該tuple的事務ID解析如下:
- t_xmin:被設置為636,表示該tuple的版本在txid=636的事務中被插入。
- t_xmax :被設置為 0,表示該tuple的版本未發(fā)生過deleted or updated.
- t_ctid:被設置為(0.1),表示該tuple位于page 0的存儲位置。這里的t_ctid和Oracle的rowid相似。
--下面對行記錄tuple進行更改:
(postgres@[local]:5432)[akendb01]#insert into table01 values(2,'aken02');INSERT 0 1(postgres@[local]:5432)[akendb01]#update table01 set name='aken03' where id=2;UPDATE 1--查看tuple id=2的事務txid:
(postgres@[local]:5432)[akendb01]#select id,name, ctid,xmin,xmax from public.table01;id | name | ctid | xmin | xmax ----+--------+-------+------+------ 1 | aken01 | (0,1) | 636 | 0 2 | aken02 | (0,2) | 638 | 639 2 | aken03 | (0,2) | 639 | 0(3 rows)(postgres@[local]:5432)[akendb01]#上面對行記錄Tuple 2即id=2執(zhí)行update之后,tuple的事務ID解析如下:
版本1:舊版本:
- t_xmin:被設置為638,表示該tuple的版本在txid=638的事務中被插入。
- t_xmax :被設置為 639,表示該tuple的版本發(fā)生了deleted or updated,為舊版本.
- t_ctid:被設置為(0.2),表示該tuple位于page 0的位置。這里的t_ctid和Oracle的rowid相似。
版本2:新版本:
- t_xmin:被設置為639,表示該tuple的版本在txid=639的事務中被插入。
- t_xmax :被設置為0,表示該tuple的版本未發(fā)生過deleted or updated.
- t_ctid:被設置為(0.2),表示該tuple位于page 0的位置。這里的t_ctid和Oracle的rowid相似。
歡迎關注頭條號查看Aken更多相關文章:
https://www.toutiao.com/c/user/54536888148/#mid=1610143870006285
參考資料:
https://www.postgresql.org/docs/12/mvcc.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt
http://www.interdb.jp/pg/pgsql05.html
---本文完---
總結
以上是生活随笔為你收集整理的oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地理模块化施工的优点_模块化建筑适合学校
- 下一篇: okhttp上传图片和其他参数_Andr