河北建设集团在哪个网站采购,新能源东莞网站建设技术支持,做网站通常用的软件,网络设计的原理事务提交会通过delayChkpt阻塞checkpoint
Postgresql事务在事务提交时#xff08;执行commit的最后阶段#xff09;会通过加锁阻塞checkpoint的执行#xff0c;尽管时间非常短#xff0c;分析为什么需要这样做#xff1a;
首先看提交堆栈
#1 0x0000000000539175 in Co…事务提交会通过delayChkpt阻塞checkpoint
Postgresql事务在事务提交时执行commit的最后阶段会通过加锁阻塞checkpoint的执行尽管时间非常短分析为什么需要这样做
首先看提交堆栈
#1 0x0000000000539175 in CommitTransaction () at xact.c:2079
#2 0x0000000000539e04 in CommitTransactionCommand () at xact.c:2824
#3 0x000000000087d1ea in finish_xact_command () at postgres.c:2482
#4 0x000000000087af27 in exec_simple_query (query_string0x24050e0 insert into t1 values (1,1);) at postgres.c:1154函数调用过程
关键函数如下
CommitTransaction...latestXid RecordTransactionCommit();...BufmgrCommit()START_CRIT_SECTION()【关键流程】END_CRIT_SECTION()latestXid TransactionIdLatest(xid, nchildren, children);SyncRepWaitForLSN(XactLastRecEnd, true);return latestXid;...ProcArrayEndTransaction(MyProc, latestXid);...// clean ...关键流程
delayChkpt阻塞checkpoint发生位置
事务提交配置delayChkpt
RecordTransactionCommit...START_CRIT_SECTION();MyPgXact-delayChkpt true;/* 写XLOGCOMMIT *//* 写CLOG内存写不刷盘 */MyPgXact-delayChkpt false;...CreateCheckPoint等待delayChkpt 联动CreateCheckPoint会在【2】等在所有Xact的delayChkpt为false才能继续
CreateCheckPoint// 【1】计算位置重要WALInsertLockAcquireExclusive();curInsert XLogBytePosToRecPtr(Insert-CurrBytePos);freespace INSERT_FREESPACE(curInsert);if (freespace 0){if (curInsert % XLogSegSize 0)curInsert SizeOfXLogLongPHD;elsecurInsert SizeOfXLogShortPHD;}checkPoint.redo curInsert;RedoRecPtr XLogCtl-Insert.RedoRecPtr checkPoint.redo;WALInsertLockRelease();// 【2】通过delayChkpt等其他所有正在提交中、正在写日志的事务vxids GetVirtualXIDsDelayingChkpt(nvxids);if (nvxids 0){do{pg_usleep(10000L); /* wait for 10 msec */} while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids));}pfree(vxids);// 【3】刷数据CheckPointGuts(checkPoint.redo, flags);// 【4】记chkpt日志XLogBeginInsert();XLogRegisterData((char *) (checkPoint), sizeof(checkPoint));recptr XLogInsert(RM_XLOG_ID,shutdown ? XLOG_CHECKPOINT_SHUTDOWN :XLOG_CHECKPOINT_ONLINE);XLogFlush(recptr);为什么checkpoint需要等事务提交
确定REDO位点是在createCheckpoint的函数前面执行的checkpoint和事务提交并发会有下面三种情况发生假设没有delayChkpt会有情况二发生 情况一redo point在commit提交前那么如果crash发生了redo过程会覆盖这条xlog不会有问题
情况二如果没有delayChkptredo point可能发生在上图中的位置然后checkpoint刷完数据后当前事务才写clogXLOG已经先写了如果crash发生了redo过程不会覆盖这条xlog而且clog信息不存在那么commit信息彻底丢掉了。
情况三redo point在事务提交后redo时xlog虽然还是做不到但是clog一定会被刷下去所以我们不会丢失事务提交信息。