日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介

發布時間:2023/12/4 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:甘植懇-Aken

PostgreSQL和Oracle、MySQL等RDBMS一樣,都有自己的并發控制機制。而并發控制的目的是為了在多個事務同時運行時保持事務ACID屬性。

MVCC即Multi-version concurrence control首字母縮寫,MVCC會為每個數據更改操作創建數據塊或數據行的新版本,同時保留舊版本,主要優點是:

'readers don't block writers,and writers don't block readers'

即“讀不會阻塞寫,而寫也不會阻塞讀”。

在Oracle中,多版本控制MVCC通過回滾段實現,當行記錄row發生更改的時候,先將數據塊的舊版本將寫入回滾段,隨后將新數據覆寫入原data block數據塊區域。在讀取數據的時候,通過比對scn來讀取合適的數據版本。

Oracle 19C Read Consistency in the Read Committed

相對Oracle來說,PostgreSQL的MVCC則使用更簡單的方法來實現。當行記錄tuple發生更改時候,新數據直接插入到原來的data page中。在讀取數據的時候,PostgreSQL通過可見性規則讀取合適的數據版本。

Transaction ids in PostgreSQL

簡單來說,PostgreSQL和Oracle在MVCC的實現上存在以下主要區別:

Oracle:基于SCN,塊級別,循環undo segment實現,支持閃回功能,存在大事務回滾、快照過舊ORA-01555問題。

PostgreSQL:基于事務編號txid,行級別,無需undo,不支持閃回,大事務可瞬間回滾,存在數據塊(data page)空間及性能消耗問題。

值得提出的是,去年Oracle中出現的SCN最大值預警問題,在PostgreSQL中通過txid循環復用來規避。

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的版本未發生過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執行update之后,tuple的事務ID解析如下:

版本1:舊版本:

  • t_xmin:被設置為638,表示該tuple的版本在txid=638的事務中被插入。
  • t_xmax :被設置為 639,表示該tuple的版本發生了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的版本未發生過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机制简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。