本文實(shí)例講述了PostgreSQL數(shù)據(jù)庫事務(wù)實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
事務(wù)簡(jiǎn)介
事務(wù)是所有數(shù)據(jù)庫系統(tǒng)的一個(gè)基本概念。 一次事務(wù)的要點(diǎn)就是它把多個(gè)步驟捆綁成了一個(gè)單一的,不成功則成仁的操作。 其它并發(fā)的事務(wù)是看不到在這些步驟之間的中間狀態(tài)的,并且如果發(fā)生了一些問題, 導(dǎo)致該事務(wù)無法完成,那么所有這些步驟都完全不會(huì)影響數(shù)據(jù)庫。PostgreSQL為每條事務(wù)創(chuàng)建一個(gè)postgre進(jìn)程,并發(fā)執(zhí)行事務(wù)。采用分層的機(jī)制執(zhí)行事務(wù),上層事務(wù)塊和底層事務(wù)。上層事務(wù)塊是用戶眼中的事務(wù),用于控制事務(wù)執(zhí)行的狀態(tài);底層事務(wù)是事務(wù)中的每條語句,可以改變上層事務(wù)塊的狀態(tài)。
上層事務(wù)塊
每個(gè)postgre進(jìn)程只有一個(gè)事務(wù)塊,上層事務(wù)塊記錄著本次事務(wù)執(zhí)行過程中的各個(gè)狀態(tài)。
typedef enum TBlockState{ /* not-in-transaction-block states */ TBLOCK_DEFAULT, /* idle */ TBLOCK_STARTED, /* 執(zhí)行簡(jiǎn)單查詢事務(wù) */ /* transaction block states */ TBLOCK_BEGIN, /* 遇見事務(wù)開始BEGIN */ TBLOCK_INPROGRESS, /* 事務(wù)正在執(zhí)行中 */ TBLOCK_PARALLEL_INPROGRESS, /* live transaction inside parallel worker */ TBLOCK_END, /* 遇見事務(wù)結(jié)束COMMIT/END的時(shí)候設(shè)置 */ TBLOCK_ABORT, /* 事務(wù)出錯(cuò),等待ROLLBACK */ TBLOCK_ABORT_END, /* 事務(wù)出錯(cuò),收到ROLLBACK */ TBLOCK_ABORT_PENDING, /* 事務(wù)處理中,接收到ROLLBACK */ TBLOCK_PREPARE, /* 事務(wù)處理中,收到PREPARE(分布式事務(wù)) */ /* subtransaction states */ TBLOCK_SUBBEGIN, /* starting a subtransaction */ TBLOCK_SUBINPROGRESS, /* live subtransaction */ TBLOCK_SUBRELEASE, /* RELEASE received */ TBLOCK_SUBCOMMIT, /* COMMIT received while TBLOCK_SUBINPROGRESS */ TBLOCK_SUBABORT, /* failed subxact, awaiting ROLLBACK */ TBLOCK_SUBABORT_END, /* failed subxact, ROLLBACK received */ TBLOCK_SUBABORT_PENDING, /* live subxact, ROLLBACK received */ TBLOCK_SUBRESTART, /* live subxact, ROLLBACK TO received */ TBLOCK_SUBABORT_RESTART /* failed subxact, ROLLBACK TO received */} TBlockState;常見的事務(wù)塊狀態(tài)轉(zhuǎn)換圖

底層事務(wù)
底層事務(wù)是需要執(zhí)行的每條命令,負(fù)責(zé)處理資源和鎖的獲取和釋放,信號(hào)的處理,日志記錄等等
typedef enum TransState{ TRANS_DEFAULT, /* idle */ TRANS_START, /* transaction starting */ TRANS_INPROGRESS, /* inside a valid transaction */ TRANS_COMMIT, /* commit in progress */ TRANS_ABORT, /* abort in progress */ TRANS_PREPARE /* prepare in progress */} TransState;主要有四個(gè)函數(shù):
分布式事務(wù)
PostgreSQL提供了分布式事務(wù)中的,兩階段提交的接口
并發(fā)控制
PostgreSQL采用MVCC的方式進(jìn)行并發(fā)控制,每個(gè)事務(wù)看到的是一段時(shí)間前的數(shù)據(jù)快照。同時(shí),MVCC并不能夠解決所有問題,所以也提供了行級(jí)和表級(jí)的鎖。
標(biāo)準(zhǔn)的事務(wù)隔離級(jí)別有4個(gè),而PostgreSQL只實(shí)現(xiàn)了讀已提交和可串行化。
鎖
PostgreSQL實(shí)現(xiàn)了8種鎖(可怕)

太多了,就記住幾個(gè)吧。
加鎖的對(duì)象
死鎖處理

MVCC
關(guān)鍵詞:
typedef struct HeapTupleFields{ TransactionId t_xmin; /* Insert,Update事務(wù) */ TransactionId t_xmax; /* Delete,Update,Row Locks事務(wù)ID */ union { CommandId t_cid; /* 操作ID */ TransactionId t_xvac; /* old-style VACUUM FULL xact ID */ } t_field3;} HeapTupleFields;cmin:插入該元組的命令在插入事務(wù)中的命令標(biāo)識(shí)(從0開始累加)cmax:刪除該元組的命令在插入事務(wù)中的命令標(biāo)識(shí)(從0開始累加)ctid:相當(dāng)于rowid , <數(shù)據(jù)塊ID,偏移量>XID:事務(wù)IDXid_snapshot:當(dāng)前系統(tǒng)中未提交的事務(wù)CLOG:事務(wù)狀態(tài)日志(已提交的日志)
隔離級(jí)別
數(shù)據(jù)可見性判斷
多行數(shù)據(jù)需要過期版本回收
日志
希望本文所述對(duì)大家PostgreSQL數(shù)據(jù)庫程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選