当前位置:网站首页>PostgreSQL source code (60) transaction system summary
PostgreSQL source code (60) transaction system summary
2022-07-07 07:12:00 【mingjie73】
relevant
《Postgresql Source code (23)Clog The use of Slru Page elimination mechanism 》
《Postgresql Source code (27) Why does the transaction commit pass delayChkpt Blocking checkpoint》
《Postgresql Source code (59) Business ID Summary of value taking and judgment rules 》
To recapitulate PG Transaction management system :
PG The transaction processing in can be divided into two parts according to the functions provided : Basic transaction state management 、 Sub transaction state management .
PG The transaction system of can be summed up in one sentence : User commands trigger state machine functions, resulting in transaction state flow , Call the underlying transaction processing function to work according to the corresponding state during flow .
1 State machine flow system
User commands trigger state machine functions, resulting in transaction state flow , Call the underlying transaction processing function to work according to the corresponding state during flow .
State machine flow function
12 A state machine flow function , It can be divided into three categories .
- Package all single lines SQL Two functions of ( Get into SQL front StartTransactionCommand、SQL After execution CommitTransactionCommand), No matter what you do begin、 still select 1, I will walk through these two functions . It is equivalent to the passive flow of transaction state .
b StartTransactionCommand
b CommitTransactionCommand
- Transaction block processing function , Corresponding to user transaction commands , stay PortalRun It calls , Active circulation transaction status .
// System internal call rollback
b AbortCurrentTransaction
// User execution begin
b BeginTransactionBlock
// User execution commit
b EndTransactionBlock
// User execution rollback、abort
b UserAbortTransactionBlock
- Sub transaction status flow .
b DefineSavepoint
b ReleaseSavepoint
b RollbackToSavepoint
b BeginInternalSubTransaction
b RollbackAndReleaseCurrentSubTransaction
b AbortOutOfAnyTransaction
The underlying transaction processing function
When the state machine flows, it will call the underlying function to work , There are two types of functions
- Basic transaction function
// Called when the transaction is started , Configure transaction status , Apply for resources
StartTransaction
// The normal commit of a transaction is to call
CommitTransaction
// Called when the transaction is rolled back , First tune AbortTransaction, In tune CleanupTransaction
CleanupTransaction
// Called when the transaction is rolled back
AbortTransaction
- Sub transaction function
StartSubTransaction
CommitSubTransaction
AbortSubTransaction
CleanupSubTransaction
2 What does the underlying transaction function do ?
StartTransaction
- Get vxid( from backendid and localid Combination value ) Represents a virtual transaction id( Writing hasn't happened yet , Cannot assign real xid)
- use vxid register MyProc, After registration, you can find vxid lock , Indicates that the transaction started
- The transaction status flows to TRANS_INPROGRESS
StartTransaction
// vxid = {backendId = 3, localTransactionId = 76407}
GetNextLocalTransactionId
VirtualXactLockTableInsert
...
s->state = TRANS_INPROGRESS;
...
CommitTransaction( There are write operations in the transaction )
Assigned transactions ID Scene
- Transaction status flow TRANS_COMMIT
- Open for checkpoint The critical area of :MyProc->delayChkpt = true(《Postgresql Source code (27) Why does the transaction commit pass delayChkpt Blocking checkpoint》)
- Write commit Transaction log for 、 Brush the transaction log
- Write clog( Don't brush )TransactionIdCommitTree
- clear ProcArray Medium xid Information
- Clean up other
- Transaction status flow TRANS_DEFAULT
CommitTransaction
s->state = TRANS_COMMIT
RecordTransactionCommit
[START_CRIT_SECTION]
[[MyProc->delayChkpt = true]]
XactLogCommitRecord
XLogFlush
TransactionIdCommitTree
[[MyProc->delayChkpt = false]]
[END_CRIT_SECTION]
ProcArrayEndTransaction
// Can get the lock and clean it normally , Can't get the lock and add list It's waiting to be cleaned up later
LWLockConditionalAcquire(ProcArrayLock, LW_EXCLUSIVE)
// Normal cleaning : clear MyProc and ProcGlobal It records xid Information
ProcArrayEndTransactionInternal
...
// clear
...
s->state = TRANS_DEFAULT
CommitTransaction( There is no write operation in the transaction )
Unassigned transaction ID
- Transaction status flow TRANS_COMMIT
- clear
- Transaction status flow TRANS_DEFAULT
CommitTransaction
s->state = TRANS_COMMIT
RecordTransactionCommit // do nothing
// clear
s->state = TRANS_DEFAULT
3 Business ID Distribute
Before you really want to write data , Would call GetCurrentTransactionId, such as heap_insert.
- Take a new one xid
- Configuration to MyProc->xid
- Configuration to ProcGlobal->xids[MyProc->pgxactoff]
- xid Lock XactLockTableInsert
TransactionId
GetCurrentTransactionId(void)
{
TransactionState s = CurrentTransactionState;
if (!FullTransactionIdIsValid(s->fullTransactionId))
AssignTransactionId(s);
return XidFromFullTransactionId(s->fullTransactionId);
}
If not assigned , perform AssignTransactionId Take a new one xid Assigned to TransactionState. Refer to this article (《Postgresql Source code (59) Business ID Summary of value taking and judgment rules 》)
AssignTransactionId
...
GetNewTransactionId
...
MyProc->xid = xid;
ProcGlobal->xids[MyProc->pgxactoff] = xid;
...
XactLockTableInsert
...
4 Sub transaction system
Example :
drop table t1;
create table t1 (c1 int, c2 int);
begin;
insert into t1 values (1,1);
savepoint a;
insert into t1 values (2,1);
savepoint b;
insert into t1 values (3,1);
Here are some differences with ordinary affairs :
State of affairs : Sub transactions will make CurrentTransactionState It has a multi-layer structure , Used between parent Connect .
p *CurrentTransactionState
$39 = {fullTransactionId = {value = 4000071}, subTransactionId = 3, name = 0x199ca60 "b", savepointLevel = 0,
state = TRANS_INPROGRESS, blockState = TBLOCK_SUBINPROGRESS, nestingLevel = 3, gucNestLevel = 3,
curTransactionContext = 0x19de090, curTransactionOwner = 0x192a458, childXids = 0x0, nChildXids = 0, maxChildXids = 0,
prevUser = 10, prevSecContext = 0, prevXactReadOnly = false, startedInRecovery = false, didLogXid = false,
parallelModeLevel = 0, chain = false, assigned = false, parent = 0x199c558}
p *CurrentTransactionState->parent
$40 = {fullTransactionId = {value = 4000070}, subTransactionId = 2, name = 0x199c6c0 "a", savepointLevel = 0,
state = TRANS_INPROGRESS, blockState = TBLOCK_SUBINPROGRESS, nestingLevel = 2, gucNestLevel = 2,
curTransactionContext = 0x19d7200, curTransactionOwner = 0x19164c8, childXids = 0x0, nChildXids = 0, maxChildXids = 0,
prevUser = 10, prevSecContext = 0, prevXactReadOnly = false, startedInRecovery = false, didLogXid = true, parallelModeLevel = 0,
chain = false, assigned = false, parent = 0xe6a940 <TopTransactionStateData>}
p *CurrentTransactionState->parent->parent
$41 = {fullTransactionId = {value = 4000069}, subTransactionId = 1, name = 0x0, savepointLevel = 0, state = TRANS_INPROGRESS,
blockState = TBLOCK_INPROGRESS, nestingLevel = 1, gucNestLevel = 1, curTransactionContext = 0x199c400,
curTransactionOwner = 0x191e3e8, childXids = 0x0, nChildXids = 0, maxChildXids = 0, prevUser = 10, prevSecContext = 0,
prevXactReadOnly = false, startedInRecovery = false, didLogXid = true, parallelModeLevel = 0, chain = false, assigned = false,
parent = 0x0}
Allocating transactions ID when , Each sub transaction will get its own XID.
AssignTransactionId
...
SubTransSetParent(XidFromFullTransactionId(s->fullTransactionId),
XidFromFullTransactionId(s->parent->fullTransactionId));
And put yourself on a higher level xid It was recorded that subtrans in (SLRU Page and CLOG The same mechanism is used , This article is part of 《Postgresql Source code (23)Clog The use of Slru Page elimination mechanism 》).
Sub transaction commit
- In addition to the above (CommitTransaction( There are write operations in the transaction )) The steps mentioned
- Writing CLOG when , It is different from the case without sub transactions
- If there are no sub transactions , direct writing CLOG that will do
- When there are sub transactions
- Writing CLOG First of all, the sub business XID To configure SUB_COMMITTED State to CLOG in
- And then the father XID Configure the submission status of
- And then we can deal with the sub business XID The state of the from SUB_COMMITTED Become submitted ( Similar to a two-stage submission )
CommitTransaction
RecordTransactionCommit
TransactionIdCommitTree
TransactionIdSetTreeStatus
// One CLOG The page is all done
TransactionIdSetPageStatus
TransactionIdSetPageStatusInternal
// every last subxid All configured TRANSACTION_STATUS_SUB_COMMITTED
for
TransactionIdSetStatusBit
// Configure
TransactionIdSetStatusBit
// Then configure the submission of sub transactions
for
TransactionIdSetStatusBit
边栏推荐
- Multidisciplinary integration
- Learning records on July 4, 2022
- Communication of components
- A slow SQL drags the whole system down
- js小练习----分时提醒问候、表单密码显示隐藏效果、文本框焦点事件、关闭广告
- Jetpack compose is much more than a UI framework~
- leetcode 509. Fibonacci number
- LVS+Keepalived(DR模式)学习笔记
- 组件的嵌套和拆分
- Initial experience of addresssanitizer Technology
猜你喜欢

父组件传递给子组件:Props

SolidWorks GB Library (steel profile library, including aluminum profile, aluminum tube and other structures) installation and use tutorial (generating aluminum profile as an example)

Leetcode t1165: log analysis

LC 面试题 02.07. 链表相交 & LC142. 环形链表II

异步组件和Suspense(真实开发中)

Tujia, muniao, meituan... Home stay summer war will start

Basic process of network transmission using tcp/ip four layer model

计算机服务中缺失MySQL服务

Maze games based on JS

Asynchronous components and suspend (in real development)
随机推荐
Network foundation - header, encapsulation and unpacking
FPGA course: application scenario of jesd204b (dry goods sharing)
Databinding exception of kotlin
linux系统rpm方式安装的mysql启动失败
Select the product attribute pop-up box to pop up the animation effect from the bottom
Sword finger offer high quality code
Config分布式配置中心
工具类:对象转map 驼峰转下划线 下划线转驼峰
How to share the same storage among multiple kubernetes clusters
SQLMAP使用教程(四)实战技巧三之绕过防火墙
Several index utilization of joint index ABC
异步组件和Suspense(真实开发中)
Use of completable future
from . onnxruntime_ pybind11_ State Import * noqa ddddocr operation error
Unity C function notes
Abnova circulating tumor DNA whole blood isolation, genomic DNA extraction and analysis
Mysql---- import and export & View & Index & execution plan
Under what circumstances should we consider sub database and sub table
How Oracle backs up indexes
栈题目:有效括号的嵌套深度