本文實例講述了PostgreSQL數據庫事務實現方法。分享給大家供大家參考,具體如下:
事務簡介
事務是所有數據庫系統的一個基本概念。 一次事務的要點就是它把多個步驟捆綁成了一個單一的,不成功則成仁的操作。 其它并發的事務是看不到在這些步驟之間的中間狀態的,并且如果發生了一些問題, 導致該事務無法完成,那么所有這些步驟都完全不會影響數據庫。PostgreSQL為每條事務創建一個postgre進程,并發執行事務。采用分層的機制執行事務,上層事務塊和底層事務。上層事務塊是用戶眼中的事務,用于控制事務執行的狀態;底層事務是事務中的每條語句,可以改變上層事務塊的狀態。
上層事務塊
每個postgre進程只有一個事務塊,上層事務塊記錄著本次事務執行過程中的各個狀態。
typedef enum TBlockState{ /* not-in-transaction-block states */ TBLOCK_DEFAULT, /* idle */ TBLOCK_STARTED, /* 執行簡單查詢事務 */ /* transaction block states */ TBLOCK_BEGIN, /* 遇見事務開始BEGIN */ TBLOCK_INPROGRESS, /* 事務正在執行中 */ TBLOCK_PARALLEL_INPROGRESS, /* live transaction inside parallel worker */ TBLOCK_END, /* 遇見事務結束COMMIT/END的時候設置 */ TBLOCK_ABORT, /* 事務出錯,等待ROLLBACK */ TBLOCK_ABORT_END, /* 事務出錯,收到ROLLBACK */ TBLOCK_ABORT_PENDING, /* 事務處理中,接收到ROLLBACK */ TBLOCK_PREPARE, /* 事務處理中,收到PREPARE(分布式事務) */ /* 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;
常見的事務塊狀態轉換圖
底層事務
底層事務是需要執行的每條命令,負責處理資源和鎖的獲取和釋放,信號的處理,日志記錄等等
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;
主要有四個函數:
分布式事務
PostgreSQL提供了分布式事務中的,兩階段提交的接口
并發控制
PostgreSQL采用MVCC的方式進行并發控制,每個事務看到的是一段時間前的數據快照。同時,MVCC并不能夠解決所有問題,所以也提供了行級和表級的鎖。
標準的事務隔離級別有4個,而PostgreSQL只實現了讀已提交和可串行化。
鎖
PostgreSQL實現了8種鎖(可怕)
太多了,就記住幾個吧。
加鎖的對象
死鎖處理
MVCC
關鍵詞:
typedef struct HeapTupleFields{ TransactionId t_xmin; /* Insert,Update事務 */ TransactionId t_xmax; /* Delete,Update,Row Locks事務ID */ union { CommandId t_cid; /* 操作ID */ TransactionId t_xvac; /* old-style VACUUM FULL xact ID */ } t_field3;} HeapTupleFields;
cmin
:插入該元組的命令在插入事務中的命令標識(從0開始累加)cmax
:刪除該元組的命令在插入事務中的命令標識(從0開始累加)ctid
:相當于rowid , <數據塊ID,偏移量>XID
:事務IDXid_snapshot
:當前系統中未提交的事務CLOG
:事務狀態日志(已提交的日志)
隔離級別
數據可見性判斷
多行數據需要過期版本回收
日志
希望本文所述對大家PostgreSQL數據庫程序設計有所幫助。
新聞熱點
疑難解答
圖片精選