- 浏览: 225345 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
在《 PostgreSQL 服务过程中的那些事二: pg 服务进程处理简单查询概览 》里话说以下面的例子对简单查询分支进行讨论,并给出了简单查询方法调用序列,下面就从这儿开始,先回顾一下上节点内容。
进入简单查询分支处理方法 exec_simple_query 后的处理基本上涵盖了《数据库系统实现》这本书里的内容。处理量相当大,先根据流程图概览一下处理过程。为了减小图的大小,把 PostgresMain 以前的调用流程略了。在以后讨论简单查询时 PostgresMain 以前的调用流程也省略了,要回顾可参见《 PostgreSQL 服务过程中的那些事二: pg 服务进程处理简单查询概览 》里的“ Postgres 服务进程处理请求的无限循环调用序列图”。
处理简单查询方法 exec_simple_query 调用序列图
主要的处理过程是先调用 start_xact_command 方法 开启一个事务,再用 pg_parse_query 方法 用词法语法解析工具把查询命令解析为解析树 parsetree ,根据需要调用 PushActiveSnapshot 方法搞一个快照,调用 pg_analyze_and_rewrite 方法分析、根据规则重写解析树为查询树 querytree ,调用 pg_plan_queries 方法把查询树转换到执行计划树 plantree ,在调用相应方法创建 portal 和在 postal 中执行执行计划树并给客户端发回结果。然后退出当前事务,清理内存。
1
现在描述这个例子: 数据库 TEST 里有表 TEST1 、 TEST2 ,现在客户端发出查询“ select cname, comp from test1, test2 where test1.id=test2.id; ”。建表的语句在下面。
create table test1 (ID numeric(10), cname varchar(30));
create table test2 (ID numeric(10), comp varchar(30));
postgres 服务进程分析了查询指令后走了简查查询分支 exec_simple_query 。
再看一下 exec_simple_query 方法的简化流程图
exec_simple_query 方法的简化流程图
2
进了 excu_simple_query 分支的第一件事就是开启一个事务命令, pg 里所有查询都要在事务里进行。下面是开启事务的调用序列图。
Postgres 服务进程简查之开始事务调用序列图
上图大红色方框中显示了启动事物的相关的相关处理,进入 StartTransaction 方法后,使 TransactionStateData * 类型静态全局变量 CurrentTransactionState 指向 TransactionStateData 类型静态全局变量 TopTransactionStateData ,在 CurrentTransactionState 设置当前事务状态,记录当前事务 ID 和当前命令 ID 。然后调用 AtStart_Memory 方法 创建内存上下文 "TransactionAbortContext" 和 "TopTransactionContext" ,接着调用 AtStart_ResourceOwner 方法在内存上下文 "TopMemoryContext" 中创建 资源属 主 ResourceOwnerData 类型变量 curTransationOwner ,并让 CurrentTransactionState 的 ResourceOwnerData* 类型成员 curTransactionOwner 指向该变量。用以上建立的结构 管理该事务涉 及到资源。描述着比较难理清关系,看下面的图吧。
记录事务状态及管理事务资源的相关结构图
从图中看见事务相关的 资源属 主 ResourceOwnerData 管理的事务资源包括关系内存缓存、系统表缓存 catcache 、关系模式缓存 relcache 、执行计划缓存 plancache 、查询命令相关元组描述符缓存 tupdesc 、事务相关快照以及打开的临时文件等。
事务状态及管理事务资源的相关结构见下面:
/*
* transaction state structure
*/
typedef struct TransactionStateData
{
TransactionId transactionId ; /* my XID, or Invalid if none */
SubTransactionId subTransactionId ; /* my subxact ID */
char * name ; /* savepoint name, if any */
int savepointLevel ; /* savepoint level */
TransState state ; /* low-level state */
TBlockState blockState ; /* high-level state */
int nestingLevel ; /* transaction nesting depth */
int gucNestLevel ; /* GUC context nesting depth */
MemoryContext curTransactionContext ; /* my xact -lifetime context */
ResourceOwner curTransactionOwner ; /* my query resources */
TransactionId * childXids ; /* subcommitted child XIDs, in XID order */
int nChildXids ; /* # of subcommitted child XIDs */
int maxChildXids ; /* allocated size of childXids[] */
Oid prevUser ; /* previous CurrentUserId setting */
int prevSecContext ; /* previous SecurityRestrictionContext */
bool prevXactReadOnly ; /* entry-time xact r/o state */
bool startedInRecovery ; /* did we start in recovery? */
struct TransactionStateData * parent ; /* back link to parent */
} TransactionStateData ;
typedef TransactionStateData * TransactionState ;
/*
* CurrentTransactionState always points to the current transaction state
* block. It will point to TopTransactionStateData when not in a
* transaction at all, or when in a top-level transaction.
*/
static TransactionStateData TopTransactionStateData = {
0, /* transaction id */
0, /* subtransaction id */
NULL, /* savepoint name */
0, /* savepoint level */
TRANS_DEFAULT , /* transaction state */
TBLOCK_DEFAULT , /* transaction block state from the client
* perspective */
0, /* transaction nesting depth */
0, /* GUC context nesting depth */
NULL, /* cur transaction context */
NULL, /* cur transaction resource owner */
NULL, /* subcommitted child Xids */
0, /* # of subcommitted child Xids */
0, /* allocated size of childXids[] */
InvalidOid, /* previous CurrentUserId setting */
0, /* previous SecurityRestrictionContext */
false, /* entry-time xact r/o state */
false, /* startedInRecovery */
NULL /* link to parent state block */
};
static TransactionState CurrentTransactionState = &TopTransactionStateData;
3
接着调用 VirtualXactLockTableInsert 方法给该事务一个 VirtualTransactionId (这个类型是把 pg 服务进程 ID 和该进程上的事务 ID 关联起来的结构) 类型的虚拟事务 ID : VXID ,并加锁。 VirtualTransactionId 的类型定义见下面:
typedef struct
{
BackendId backendId ; /* determined at backend startup */
LocalTransactionId localTransactionId ; /* backend -local transaction
* id */
} VirtualTransactionId ;
然后为这个新事物调用下面的方法初始化相关子系统。
在事务开始时调用 AtStart_GUC() 设置事务嵌套层数,调用 AtStart_Inval() 方法初始化管理该事务失效信息用的 TransInvalidationInfo 类型 结构,调用 AtStart_Cache 方法从共享失效消息队列读取并处理失效消息,调用 AfterTriggerBeginXact 方法初始化 AfterTriggersData 类型结构以备后面处理相关 AFTER 的触发器。 AfterTriggersData 的结构定义见下面:
typedef struct AfterTriggersData
{
CommandId firing_counter ; /* next firing ID to assign */
SetConstraintState state ; /* the active S C state */
AfterTriggerEventList events ; /* deferred-event list */
int query_depth ; /* current query list index */
AfterTriggerEventList * query_stack ; /* events pending from each query */
int maxquerydepth ; /* allocated len of above array */
MemoryContext event_cxt ; /* memory context for events, if any */
/* these fields are just for resetting at subtrans abort: */
SetConstraintState * state_stack ; /* stacked S C states */
AfterTriggerEventList * events_stack ; /* stacked list pointers */
int * depth_stack ; /* stacked query_depths */
CommandId * firing_stack ; /* stacked firing_counters */
int maxtransdepth ; /* allocated len of above arrays */
} AfterTriggersData ;
在 StartTransaction 方法里主要干了上面这些事并设置了记录事务状态的结构 CurrentTransactionState 的成员,其中有一个成员 TransState state , TransState 是枚举类型,表示事务状态,其定义如下:
/*
* transaction states - transaction state from server perspective
*/
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 ;
好了,这节就到这儿。
------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 1971题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1771话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1621话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1361话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1298Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1717话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1468话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1724话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1586话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1795话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1255话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1197话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15243 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5627到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13233 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1522话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 13833 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1544话说 main()->Postm ... -
PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
2012-07-12 16:24 1423话说启动进程调用 Startup ...
相关推荐
一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: . 50 PostgreSQL PostgreSQL...
PostgreSQL技术内幕:事务处理深度探索.docx
查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql
中文手册介绍了如何使用pgAdmin维护PostgreSQL数据库。 pgAdmin支持数据库服务器7.3及以上版本。 对于低于7.3版本的请使用pgAdmin II。
图文并茂的介绍PG数据库的事务 为阅读方便已添加书签
NULL 博文链接:https://haige18.iteye.com/blog/1746527
一、服务器进程的启动和关闭: 下面是pg_ctl命令的使用方法和常用选项,需要指出的是,该命令是postgres命令的封装体,因此在使用上比直接使用postgres更加方便。 代码如下: pg_ctl init[db] [-D DATADIR] [-s]...
赠送jar包:postgresql-42.3.1.jar; 赠送原API文档:postgresql-42.3.1-javadoc.jar; 赠送源代码:postgresql-42.3.1-sources.jar; 赠送Maven依赖信息文件:postgresql-42.3.1.pom; 包含翻译后的API文档:...
嵌入式postgresql服务器为在unittests中运行postgres二进制文件提供了一种与平台无关的方法。
postgresql &pg源码安装编译教程
存储过程 postgresql postgresql存储过程
1.nacos服务,适配postgresql数据库。 2.提供nacos,postgresql的创建nacos数据库脚本。 3.nacos/conf/nacos-pg.sql数据库脚本文件。 4.nacos版本1.4.2。
postgresql数据库jdbc驱动,jar包。。。。。。。。。。。。
SQL Server 2000链接服务器到PostgreSQL
赠送jar包:postgresql-42.2.5.jar; 赠送原API文档:postgresql-42.2.5-javadoc.jar; 赠送源代码:postgresql-42.2.5-sources.jar; 赠送Maven依赖信息文件:postgresql-42.2.5.pom; 包含翻译后的API文档:...
本程序的重点是如何利用C#对PostgreSQL数据库进行操作,PDatabase.cs是一个完整的操作类,role是角色表的操作类,程序采用三层架构模型。 在对PostgreSQL数据库进行操作时,用到了如何调用存储过程来完成各项操作。...
关于PostGreSQL中的存储过程 PostGreSQL是一个开源的数据库
PostgreSQL9.6.0-CN中文指南 PG DBA必备
PostgreSQL中国社区资深数据库专家、沃趣科技首席数据库架构师撰写,PostgreSQL数据库领域经典著作 系统讲解PostgreSQL技术内幕,深入分析PostgreSQL特色功能,包含大量来自实际生产环境的经典案例和经验总结 ...
linux搭建postgresql、postgis、pg_pathman环境步骤以及需要的软件包