成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PostgreSQL中commitlog有什么作用

本篇內(nèi)容主要講解“PostgreSQL中commit log有什么作用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PostgreSQL中commit log有什么作用”吧!

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于網(wǎng)站制作、成都網(wǎng)站設計、潮安網(wǎng)絡推廣、小程序開發(fā)、潮安網(wǎng)絡營銷、潮安企業(yè)策劃、潮安品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供潮安建站搭建服務,24小時服務熱線:13518219792,官方網(wǎng)址:jinyejixie.com

Concurrency Control并發(fā)控制是一種機制,在并發(fā)進行多個事務時維護一致性(Consistency)和隔離性(Isolation),一致性和隔離性是數(shù)據(jù)庫事務ACID(Atomicity, Consistency, Isolation, Durability) 屬性中的C和I。
多版本并發(fā)控制(MVCC)是廣泛使用的并發(fā)控制技術,其主要優(yōu)勢是讀不會阻塞寫,而寫也不會阻塞讀。MVCC有很多種變體,PostgreSQL使用一種稱為快照隔離Snapshot Isolation (SI)的MVCC變體實現(xiàn)并發(fā)控制。
在MVCC中,每個DML操作創(chuàng)建一個數(shù)據(jù)(包括Index)的新版本,同時保留之前的舊版本。當事務讀取數(shù)據(jù)時,選擇其中一個“正確”的版本,以確保各個事務之間的隔離。
在 Multi Version Heap Tuple 這一章節(jié)中提到事務回滾后,新寫入的數(shù)據(jù)仍存儲在heap中,PostgreSQL如何識別產(chǎn)生這些數(shù)據(jù)的事務的狀態(tài)(提交/回滾/進行中),從而確定哪些tuple可見不可見?PG通過clog(commit log)存儲每個事務的狀態(tài),在數(shù)據(jù)庫啟動時,clog文件會加載到共享內(nèi)存中,checkpoint時會把共享內(nèi)存中的事務狀態(tài)信息刷新到磁盤上.

一、基本概念

事務ID
當一個事務開啟時,PostgreSQL事務管理器會為該事務分配一個唯一的事務ID(txid,無符號32bit整型).
通過txid_current()函數(shù)可獲取當前事務號.

testdb=# begin;
BEGIN
testdb=# select txid_current();
 txid_current 
--------------
         2308
(1 row)
testdb=#

在PG中,以下為系統(tǒng)保留使用的txid:
txid = 0,表示 Invalid txid,用于判斷txid的有效性
txid = 1,表示 Bootstrap txid,在intidb初始化數(shù)據(jù)庫時使用
txid = 2,表示 Frozen txid,在事務ID回卷時,通過vacuum進程處理時使用

事務狀態(tài)
PostgreSQL定義了四種事務狀態(tài),分別是IN_PROGRESS(進行中), COMMITTED(已提交), ABORTED(已回滾), 和 SUB_COMMITTED(子事務已提交).

/*
 * Possible transaction statuses --- note that all-zeroes is the initial
 * state.
 * 可能的事務狀態(tài) --- 注意初始狀態(tài)全部為ASCII 0
 *
 * A "subcommitted" transaction is a committed subtransaction whose parent
 * hasn't committed or aborted yet.
 * "subcommitted"事務是指已提交的子事務,而該子事務所在的父事務尚未提交或者回滾.
 */
typedef int XidStatus;
#define TRANSACTION_STATUS_IN_PROGRESS      0x00
#define TRANSACTION_STATUS_COMMITTED        0x01
#define TRANSACTION_STATUS_ABORTED          0x02
#define TRANSACTION_STATUS_SUB_COMMITTED    0x03

二、clog文件

物理文件
clog文件存儲在$PGDATA/pg_xact目錄中

[xdb@localhost pg_xact]$ ll
total 8
-rw-------. 1 xdb xdb 8192 Jan  8 15:55 0000
[xdb@localhost pg_xact]$

clog segment
如前所述,事務號是無符號的32bit整型,PG通過以下公式邏輯上把clog劃分為N個segment:
N = 0xFFFFFFFF/CLOG_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT
其中:
CLOG_XACTS_PER_PAGE定義為

/* We need two bits per xact, so four xacts fit in a byte */
#define CLOG_BITS_PER_XACT  2 -->每個事務狀態(tài)使用2bits表示
#define CLOG_XACTS_PER_BYTE 4 -->每個Byte可存儲4個事務狀態(tài)
#define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE) -->每個page可存儲8192*4個事務狀態(tài)

即CLOG_XACTS_PER_PAGE = 8192*4
SLRU_PAGES_PER_SEGMENT定義為

#define SLRU_PAGES_PER_SEGMENT  32

代入公式中:
N = 0xFFFFFFFF/CLOG_XACTS_PER_PAGE/SLRU_PAGES_PER_SEGMENT
 = 0xFFFFFFFF/(8192*4)/32
 = 4096

物理上,每個segment有32個Pages(SLRU_PAGES_PER_SEGMENT = 32),則每個segment file大小為8K*32=256K.

三、txid & clog

給定一個事務號,如何獲取該事務對應的狀態(tài)?
PG首先通過該事務號獲得該事務狀態(tài)存儲在clog中哪個page中(即pageno),然后再定位存儲事務狀態(tài)的Byte在該page中的偏移以及在該Byte中的偏移.

 #define TransactionIdToPage(xid)    ((xid) / (TransactionId) CLOG_XACTS_PER_PAGE)
 #define TransactionIdToPgIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_PAGE)
 #define TransactionIdToByte(xid)    (TransactionIdToPgIndex(xid) / CLOG_XACTS_PER_BYTE)
 #define TransactionIdToBIndex(xid)  ((xid) % (TransactionId) CLOG_XACTS_PER_BYTE)

如給定事務號2308,根據(jù)上述公式可得到:
Page = 2308 / (8192*4) = 0 —> 第0號page
PageIndex = 2308 % (8192*4) = 2308 —> Page內(nèi)偏移
ByteInPage = 2308 / 4 = 577 —> 該Page內(nèi)的第577個Byte
ByteIndex = 2304 % 4 = 0 —> 該字節(jié)中的首2bits
下面通過實際案例驗證
開啟事務

testdb=# begin;
BEGIN
testdb=# select txid_current();
 txid_current 
--------------
         2308
(1 row)

查看clog

[xdb@localhost pg_xact]$ hexdump -C ./0000 -s 577 -n 1
00000241  00                                                |.|
00000242

0x00 —> TRANSACTION_STATUS_IN_PROGRESS

提交事務
執(zhí)行checkpoint,刷新到磁盤上

testdb=# commit;
COMMIT
testdb=# checkpoint;
CHECKPOINT

查看clog

[xdb@localhost pg_xact]$ hexdump -C ./0000 -s 577 -n 1
00000241  01                                                |.|
00000242

值為0x01 —> TRANSACTION_STATUS_COMMITTED

重新開啟一個事務2309,回滾該事務,clog中的值應為0x09(二進制值為:0000 1001)

testdb=# begin;
BEGIN
testdb=# select txid_current();
 txid_current 
--------------
         2309
(1 row)
testdb=# select 2308%4;
 ?column? 
----------
        0
(1 row)
testdb=# rollback;
ROLLBACK
testdb=# checkpoint;
CHECKPOINT
testdb=#

clog文件中的內(nèi)容0x09,與預期中的一致.

[xdb@localhost pg_xact]$ hexdump -C ./0000 -s 577 -n 1
00000241  09                                                |.|
00000242
[xdb@localhost pg_xact]$

到此,相信大家對“PostgreSQL中commit log有什么作用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

分享題目:PostgreSQL中commitlog有什么作用
新聞來源:http://jinyejixie.com/article38/gdhosp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供、品牌網(wǎng)站制作網(wǎng)站制作、面包屑導航、外貿(mào)建站、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計
东乌珠穆沁旗| 石家庄市| 蒙阴县| 衡水市| 甘洛县| 丽水市| 黎平县| 肇州县| 宁乡县| 沐川县| 香格里拉县| 建德市| 商河县| 钟祥市| 钟祥市| 沂水县| 四子王旗| 凤台县| 巫溪县| 聂荣县| 大英县| 庆安县| 五常市| 伊宁县| 潼南县| 巴林右旗| 临沧市| 柘城县| 镇雄县| 东丰县| 德格县| 稷山县| 上林县| 梁山县| 遵义市| 乌兰县| 阿克苏市| 肇州县| 义乌市| 河曲县| 平定县|