事務可見性的判斷和事務隔離級別,PostgreSQL和MySQL實現上有啥區別

哎呀我的天吶發表於2023-02-24

事務可見性(Transaction Visibility)是指在資料庫事務中,一個事務提交後,其對其他事務是否可見的規則。

在 PostgreSQL 和 MySQL 中,事務可見性的實現有一些區別:

在 PostgreSQL 中,每個事務都有一個全域性的可見性戳(Global Visibility Map),該戳用於記錄每個頁面中的行是否對於當前事務可見。在事務開始時,事務會初始化一個可見性掩碼(Visibility Mask),該掩碼用於記錄當前事務所涉及的資料頁的可見性戳的情況。在事務進行過程中,對於訪問到的每個資料頁,事務會檢查可見性戳和可見性掩碼,從而確定當前事務能否看到該資料頁中的行。如果當前事務對於該資料頁中的行不可見,則會執行相應的行版本控制操作(如行版本回滾),以保證事務的可重複性。

在 MySQL 中,使用多版本併發控制(Multi-Version Concurrency Control,MVCC)機制實現事務可見性。在 MVCC 中,每個事務讀取到的資料行的版本號(Version)都是在事務開始時確定的。當事務提交時,資料庫會將該事務所涉及到的所有資料行的版本號更新為該事務的提交版本(Commit Version)。其他事務讀取到該資料行時,會根據自己的事務版本號和資料行版本號,判斷當前資料行是否對於自己可見。

總的來說,PostgreSQL 和 MySQL 的事務可見性實現有一些差異,但它們都採用了行版本控制的機制,以保證事務的可重複性和資料一致性。

PostgreSQL 和 MySQL 在事務隔離級別的實現上也有一些區別。

PostgreSQL 和 MySQL 都支援四種標準的事務隔離級別:讀未提交(Read Uncommitted)、讀已提交(Read Committed)、可重複讀(Repeatable Read)和序列化(Serializable)。這些隔離級別都有不同的特點和適用場景。

在 PostgreSQL 中,隔離級別的實現是基於多版本併發控制(Multi-Version Concurrency Control,MVCC)機制的。在 MVCC 中,每個事務讀取到的資料行的版本號(Version)都是在事務開始時確定的,事務提交時,資料庫會將該事務所涉及到的所有資料行的版本號更新為該事務的提交版本(Commit Version)。不同的隔離級別主要體現在如何確定當前事務可見的資料行的版本號。例如,在可重複讀隔離級別中,PostgreSQL 會對每個事務建立一個獨立的快照,該快照用於記錄事務開始時的所有資料行版本號,在事務執行期間,只能讀取該快照中的資料行,而不能讀取其他事務提交的新版本資料行。

在 MySQL 中,隔離級別的實現也是基於 MVCC 機制的。在 MySQL 中,每個事務也有一個獨立的事務檢視(Transaction View),用於記錄當前事務可以讀取的資料行版本號。不同的隔離級別主要體現在如何確定當前事務可見的資料行的版本號以及如何處理事務間的衝突。例如,在可重複讀隔離級別中,MySQL 會為每個事務建立一個獨立的快照,該快照用於記錄事務開始時的所有資料行版本號,在事務執行期間,只能讀取該快照中的資料行,而不能讀取其他事務提交的新版本資料行。在 MySQL 中,還有一個特殊的隔離級別“讀已提交(Read Committed)”,該隔離級別可以透過加鎖機制實現。

總的來說,PostgreSQL 和 MySQL 在事務隔離級別的實現上都基於 MVCC 機制,但在細節方面可能有所差異,例如如何確定當前事務可見的資料行版本號、如何處理事務間的衝突等。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29990276/viewspace-2936913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章