- 浏览: 232231 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
话说 查询“ select cname, comp from test1, test2 where test1.id=test2.id; ” 发送到服务器端, 走查询分支 exec_simple_query ,先调用 start_xact_command 初始化了事务管理相关对象和资源,接着调用 pg_parse_query ,通过 Lex 和 Yacc 对传入 SQL 语句进行词法语法解析,生成解析树。下来调用 GetTransactionSnapshot 方法做内存快照。内存快照和事务隔离级别紧密相关,其中 可重复读和序列化隔离级别每个数据库事务使用一个快照,读未提交和读已提交隔离级别每个语句使用一个快照。序列化隔离级别除快照外还使用 predicate 锁。
1
下面是做内存快照的调用序列图。
Postgres 服务进程简查之开始事务调用序列图
上图红色方框中显示了获取内存快照的方法调用过程,在 GetSnapshotData 方法中根据事务隔离级别等情况获取相应快照,一般 可优化语句(增、删、查、改)都需要快照, 然后注册相应快照。下面是获取快照方法 GetTransactionSnapshot 的流程图。
GetTransactionSnapshot 方法流程图
GetTransactionSnapshot() 方法根据事务隔离级别 分别处理取快照的情况。如果事务隔离级别是 读未提交、读已提交, 调用 GetSnapshotData(&CurrentSnapshotData) 方法获取一个快照赋给 CurrentSnapshot ,返回 CurrentSnapshot 。如果事务隔离级别是 可重复读或序列化 ,且是事务里第一次获取快照,直接返回 CurrentSnapshot ;不是第一次且是 可重复读 事务隔离级别,调用 GetSnapshotData(&CurrentSnapshotData) 方法获取一个快照赋给 CurrentSnapshot ,然后 调用 RegisterSnapshotOnOwner(CurrentSnapshot, TopTransactionResourceOwner) 方法 在资源管理器 TopTransactionResourceOwner 里注册这个快照;不是第一次且是 序列化 事务隔离级别, 调用 RegisterSerializableTransaction(&CurrentSnapshotData) 方法,根据需要调用 GetSnapshotData 方法获取快照并调用 RegisterSnapshotOnOwner 方法在资源属主 TopTransactionResourceOwner 上注册快照,并初始化一个可序列化事务 SERIALIZABLEXACT 结构和哈西表 。最后,不管什么情况都返回当前快照,调用 PushActiveSnapshot 方法,把这个快照推入由 ActiveSnapshotElt 构成的 “活跃快照”栈 。
在 pg 里快照就是数据结构 SnapshotData ,定义如下,表示某个时刻内存里对象的状态,下面是快照 SnapshotData 结构定义:
typedef struct SnapshotData
{
SnapshotSatisfiesFunc satisfies ; /* tuple test function */
/*
* The remaining fields are used only for MVCC snapshots, and are normally
* just zeroes in special snapshots. (But xmin and xmax are used
* specially by HeapTupleSatisfiesDirty.)
*
* An MVCC snapshot can never see the effects of XIDs >= xmax . It can see
* the effects of all older XIDs except those listed in the snapshot.
xmin
* is stored as an optimization to avoid needing to search the XID arrays
* for most tuples.
*/
TransactionId xmin ; /* all XID < xmin are visible to me */
TransactionId xmax ; /* all XID >= xmax are invisible to me */
uint32 xcnt ; /* # of xact ids in xip [] */
TransactionId * xip ; /* array of xact IDs in progress */
/* note: all ids in xip [] satisfy xmin <= xip [i] < xmax */
int32 subxcnt ; /* # of xact ids in subxip [] */
TransactionId * subxip ; /* array of subxact IDs in progress */
bool suboverflowed ; /* has the subxip array overflowed? */
bool takenDuringRecovery ; /* recovery-shaped snapshot? */
/*
* note: all ids in subxip [] are >= xmin , but we don't bother filtering
* out any that are >= xmax
*/
CommandId curcid ; /* in my xact , CID < curcid are visible */
uint32 active_count ; /* refcount on ActiveSnapshot stack */
uint32 regd_count ; /* refcount on RegisteredSnapshotList */
bool copied ; /* false if it's a static snapshot */
} SnapshotData ;
这里面最复杂的是在序列化隔离级别下事务的正常运转,部分体现在 RegisterSerializableTransaction 方法调用了 RegisterSerializableTransactionInt 方法,其流程图在下面
RegisterSerializableTransactionInt 流程图
RegisterSerializableTransactionInt 里,利用 predicate lock 相关的哈西表, PredXactListData 、 PredXactListElementData 等组成的链表结构, RWConflictPoolHeaderData 、 RWConflictData 等组成的链表结构等一起管理 predicate lock 和 serializablexact 结构,(具体个数据结构参见 《 PostgreSQL 启动过程中的那些事七:初始化共享内存和信号九: shmem 中初始化 Predicate 锁 》 ) 利用可序列化快照隔离( Serializable Snapshot Isolation (SSI) ) ,实现了事务的 完全可序列化隔离级别,以支持该事务隔离级别下事务的正常运转。
利用可序列化快照隔离( Serializable Snapshot Isolation (SSI) )的 相关情况 最初是在下面的论文里描述:
Michael J. Cahill , Uwe R 枚 hm , and Alan D. Fekete . 2008.
Serializable isolation for snapshot databases.
In SIGMOD '08: Proceedings of the 2008 ACM SIGMOD
international conference on Management of data,
pages 729-738, New York, NY, USA. ACM.
http://doi.acm.org/10.1145/1376616.1376690
在下面的博士论文里做了进一步阐述。
Michael James Cahill . 2009.
Serializable Isolation for Snapshot Databases.
Sydney Digital Theses.
University of Sydney , School of Information Technologies.
http://hdl.handle.net/2123/5353
就到这儿吧。
------------
转载请注明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2074题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1851话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1753话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1440话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1409Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1558话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1900在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1810话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1640话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1873话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1327话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1265话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15833 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5715到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13873 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1628话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14393 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1658话说 main()->Postm ... -
PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
2012-07-12 16:24 1493话说启动进程调用 Startup ...
相关推荐
三、 pg_attrdef: pg_attrdef: pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef: . 63 四、 pg_authid: pg_authid: pg_authid: pg_authid:pg_authid: 64 五、 pg_auth_members: pg_...
pgAdmin是一款免费的开源软件,专为PostgreSQL设计,提供了直观的界面,使得数据库的管理、查询、备份以及监控等工作变得简单易行。 **1. pgAdmin简介** pgAdmin是PostgreSQL数据库管理员和开发者的理想选择,它...
总结来说,调试PostgreSQL存储过程涉及多个层面,从简单的日志记录到复杂的源码调试,都需要对PostgreSQL有深入的理解。熟练掌握这些技巧,将有助于提升数据库应用的稳定性和性能。通过不断实践和学习,你可以成为一...
Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的集合,它可以完成复杂的操作,并且可以重复使用。Postgresql存储过程可以用来实现业务逻辑,减少数据库服务器的压力和网络传输的数据量。 一、存储...
在Linux系统上搭建PostgreSQL、PostGIS和pg_pathman环境是一项关键的任务,这些组件共同构成了一个强大的地理空间数据库解决方案。PostgreSQL是一种开源的关系型数据库管理系统,具有高度的可扩展性和可靠性;...
DBD::Pg作为DBI的子模块,专为PostgreSQL提供服务。 **PostgreSQL与libpq** PostgreSQL,通常简称为Postgres,是一种开源的关系型数据库管理系统(RDBMS),以其高度的稳定性和强大的功能著称。libpq是PostgreSQL...
在PostgreSQL数据库系统中,后台工作进程(Background Worker)是一种扩展其功能的重要机制。这些进程独立于主要的数据库服务器进程运行,允许开发者实现自定义任务,如定期维护、监控或其他后台服务。Go语言以其...
PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它以其强大的功能、高度的稳定性以及对ACID(原子性、一致性、隔离性、持久性)事务的支持而受到广大开发者的欢迎。离线安装包通常是为了在没有网络连接...
在本文中,我们将深入探讨 PostgreSQL 的事务处理机制,包括事务的基本概念、事务处理的原理、事务处理的优化方案等。 事务处理在数据库中的重要性 事务处理是数据库系统中非常重要的一个环节,它确保了数据的...
- `src/backend/utils/misc/pg_shmem.c`文件中实现了共享内存的相关功能,这对于多进程之间的通信非常重要。 #### 五、PostgreSQL与MySQL对比 **1. PostgreSQL文件目录组织**: - 整体代码结构清晰,遵循了良好的...
查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql
在本文中,我们将深入探讨pgAdmin3的功能、安装过程以及如何使用它来管理PostgreSQL数据库。 ### pgAdmin3 简介 pgAdmin3 是一个开源的、跨平台的应用程序,适用于Windows、Linux、Mac OS X等多种操作系统。作为...
在PostgreSQL数据库管理系统中,获取表名和字段名是数据库管理员和开发人员日常工作中常见的任务。这有助于了解数据库结构,进行数据操作、查询优化或设计新的应用程序。以下是一些关于如何在PostgreSQL中获取这些...
【PostgreSQL教程(十一):服务器配置】 在PostgreSQL中,服务器配置是管理和优化数据库性能的关键环节。本教程主要涵盖服务器进程的启动和关闭以及配置参数的设置。 ### 一、服务器进程的启动和关闭 PostgreSQL...
PostgreSQL 存储过程详解 PostgreSQL 是一个开源的数据库管理系统,它提供了强大的数据存储和管理功能。...本文详细介绍了 PostgreSQL 中的存储过程,并提供了一个使用函数来查询数据的示例代码。
这样的设计对于那些需要在本地或内存中快速访问数据的应用,或者希望减少对外部服务依赖的开发场景特别有用。在【unittests】中使用嵌入式PostgreSQL服务器,可以方便地进行数据库相关的测试,因为无需安装或配置...
7. **扩展支持**:pgAdmin3能够管理PostgreSQL的各种扩展,如PostGIS(地理空间数据库)、PL/pgSQL(内置过程语言)和其他第三方模块。 8. **多语言支持**:pgAdmin3-1.8.4支持多种语言,包括中文,使得非英语用户...
在IT行业中,Presto是一个分布式SQL查询引擎,设计用于快速处理大规模的数据。它支持多种数据源,包括Hadoop Distributed File System (HDFS)、Amazon S3、Cassandra以及我们这里关注的PostgreSQL。本篇文章将详细...
在实际应用中,DBD::Pg允许开发者执行SQL查询、事务管理、游标操作、结果集处理等常见的数据库操作。使用DBI和DBD::Pg,开发者可以编写可移植的代码,只需更换数据库驱动,就可以轻松地将应用程序从一种数据库系统...
7. **启动服务**:使用 `pg_ctl` 或者服务管理工具启动 PostgreSQL 服务。 8. **创建第一个数据库和用户**:使用 `createdb` 创建数据库,使用 `createuser` 创建数据库用户,并给予适当的权限。 9. **安装和配置...