本篇內(nèi)容主要講解“PostgreSQL事務(wù)處理機(jī)制原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“PostgreSQL事務(wù)處理機(jī)制原理”吧!
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的臨西網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!背景說明:
以ACID為特征的事務(wù)是關(guān)系數(shù)據(jù)庫的一項(xiàng)重要的也是基本的功能。了解事務(wù)的實(shí)現(xiàn)原理不僅對數(shù)據(jù)庫產(chǎn)品本身的開發(fā),對使用數(shù)據(jù)庫的應(yīng)用程序的開發(fā)也有一定的益處。因此本次以PostgreSQL為對象簡單介紹了其事務(wù)實(shí)現(xiàn)的原理。
內(nèi)容概述:
事務(wù)的實(shí)現(xiàn)原理可以解讀為DBMS采取何種技術(shù)確保事務(wù)的ACID特性。PostgreSQL針對ACID的實(shí)現(xiàn)技術(shù)如下表所示。
表1:事務(wù)的4個(gè)特征ACID及響應(yīng)的實(shí)現(xiàn)技術(shù)
ACID | 實(shí)現(xiàn)技術(shù) |
原子性 | MVCC |
一致性 | 約束(主鍵,外鍵等) |
隔離性 | MVCC |
持久性 | WAL |
可以看到PostgreSQL中支撐ACID的主要是MVCC和WAL兩項(xiàng)技術(shù)。MVCC和WAL是兩個(gè)比較成熟的技術(shù),通常的關(guān)系數(shù)據(jù)庫中都有相應(yīng)的實(shí)現(xiàn),但每個(gè)數(shù)據(jù)庫具體的實(shí)現(xiàn)方式又存在很大差異。下面介紹一下PostgreSQL中MVCC和WAL的基本實(shí)現(xiàn)原理。
1. MVCC
MVCC(Multiversion Concurrency Control)即多版本并發(fā)控制,它可以避免讀寫事務(wù)之間的互相阻塞,相比通常的封鎖技術(shù)可極大的提高業(yè)務(wù)的并發(fā)性能。PostgreSQL中的MVCC實(shí)現(xiàn)原理可簡單概括如下:
1)數(shù)據(jù)文件中存放同一邏輯行的多個(gè)行版本(稱為Tuple)
2)每個(gè)行版本的頭部記錄創(chuàng)建以及刪除該行版本的事務(wù)的ID(分別稱為xmin和xmax)
3)每個(gè)事務(wù)的狀態(tài)(運(yùn)行中,中止或提交)記錄在pg_clog文件中
4)根據(jù)上面的數(shù)據(jù)并運(yùn)用一定的規(guī)則每個(gè)事務(wù)只會看到一個(gè)特定的行版本
通過MVCC讀寫事務(wù)可以分別在不同的行版本上工作,因此能夠在互不沖突的情況下并發(fā)執(zhí)行。
圖1:基于MVCC的數(shù)據(jù)更新舉例
2. WAL
當(dāng)系統(tǒng)意外宕機(jī)后,恢復(fù)時(shí)需要回退未完成事務(wù)所做的更改并確保已提交事務(wù)所作的更改均已生效。在PostgreSQL中通過前面提到的MVCC很容易做到的第一點(diǎn),只要把所有pg_clog文件中記錄的所有“運(yùn)行中”的事務(wù)的狀態(tài)置為“中止”即可,這些事務(wù)在宕機(jī)時(shí)都沒有結(jié)束。對于第二點(diǎn),必須確保事務(wù)提交時(shí)修改已真正寫入到永久存儲中。但是直接刷新事務(wù)修改后的數(shù)據(jù)到磁盤是很費(fèi)時(shí)的,為解決這個(gè)問題于是引入了WAL(Write-Ahead Log)。
WAL的基本原理如下:
1)更新數(shù)據(jù)頁前先將更新內(nèi)容記入WAL日志
2)異步刷新數(shù)據(jù)Buffer的臟頁和WAL Buffer到磁盤
3)Buffer管理器確保絕不會先于對應(yīng)的WAL記錄刷新臟數(shù)據(jù)到磁盤
4)事務(wù)提交時(shí),將WAL日志同步刷新到磁盤
5)Checkpoint發(fā)生時(shí),將數(shù)據(jù)Buffer的所有臟頁刷新到磁盤
圖2:數(shù)據(jù)更新時(shí)的Buffer修改
圖3:更新提交和Checkpoint時(shí)的磁盤同步
Q&A:
1、Q:PostgreSQL中DDL支不支持事務(wù)?
A:支持。PostgreSQL中對DDL的處理方式和普通的DML類似,也是支持事務(wù)的。
2、 Q:PostgreSQL中對BLOB數(shù)據(jù)的處理支不支持事務(wù)?
A:支持。對BLOB(bytea或large object)數(shù)據(jù)的事務(wù)處理和普通數(shù)據(jù)的差別不大,但由于BLOB數(shù)據(jù)較大涉及BLOB的事務(wù)會產(chǎn)生很大的WAL日志文件。
3、Q:PostgreSQL中很大的數(shù)據(jù),比如BLOB如何在數(shù)據(jù)頁面中存儲?
A:默認(rèn)數(shù)據(jù)頁面的大小是8K,當(dāng)有很大數(shù)據(jù)時(shí)可能導(dǎo)致一個(gè)頁面放不下整個(gè)數(shù)據(jù)行。針對這種情況,PostgreSQL采取一種叫做TOAST的技術(shù),對于比較大的列只在行中放一個(gè)類似指針的東西,完整的數(shù)據(jù)放在另一個(gè)單獨(dú)的TOAST表中。在TOAST表中數(shù)據(jù)被切割成若干個(gè)chunk,每個(gè)chunck以一個(gè)數(shù)據(jù)行的形式存放。
4、Q:PostgreSQL中可重復(fù)讀和可串行化隔離級別都不會出現(xiàn)幻讀那它們的區(qū)別是什么?
A: 根據(jù)SQL規(guī)約,能夠回避幻讀就已經(jīng)滿足了“可串行化”隔離級別的要求。但是SQL規(guī)約定義的“可串行化”并不是嚴(yán)格意義上的可串行化,僅僅能回避幻讀不等于可以把并發(fā)執(zhí)行的幾個(gè)事務(wù)轉(zhuǎn)化為幾個(gè)事務(wù)嚴(yán)格按某個(gè)順序先后執(zhí)行 。PostgreSQL中的可重復(fù)讀可以回避幻讀但不是嚴(yán)格意義上的可串行化,但是可串行化就是。順便說一下,Oracle中的可串行化也不是嚴(yán)格意義上的可串行化,實(shí)際上它等價(jià)于PostgreSQL中的可重復(fù)讀。
5、Q:PostgreSQL中事務(wù)ID分配完了怎么辦?
A:從頭開始重新分配(實(shí)際上從3開始重新分配,0,1,2已做為特殊用途,這稱之為事務(wù)回卷)。但這樣可能形成事務(wù)ID沖突的問題,PostgreSQL中解決這個(gè)問題的措施有兩個(gè)。第一,定期清理留在數(shù)據(jù)文件中的過老的事務(wù)ID,將它們統(tǒng)一設(shè)置為一個(gè)特殊值(2),在做事務(wù)新舊比較時(shí),這個(gè)特殊的事務(wù)ID永遠(yuǎn)比其他普通的事務(wù)ID舊。這就保證了系統(tǒng)中事務(wù)ID的范圍跨度不會過大。第二,在做事務(wù)新舊比較時(shí)不是簡單的比較兩個(gè)事務(wù)ID的算數(shù)值大小,而且考慮到了特殊事務(wù)ID和事務(wù)回卷的情況。比如根據(jù)內(nèi)部的比較規(guī)則,無符號INT類型的事務(wù)ID 0x00000005比0xFFFFFFFF新。因?yàn)榈谝粋€(gè)措施已經(jīng)保證了系統(tǒng)中事務(wù)ID間的跨度不會過大(不超過2^31),所以0x00000005一定是事務(wù)ID回卷后的結(jié)果而0xFFFFFFFF還沒有發(fā)生回卷(或者說比0x00000005少回卷一次)。
到此,相信大家對“PostgreSQL事務(wù)處理機(jī)制原理”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
名稱欄目:PostgreSQL事務(wù)處理機(jī)制原理-創(chuàng)新互聯(lián)
路徑分享:http://jinyejixie.com/article40/cshseo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、定制網(wǎng)站、響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容