`

PostgreSQL服务过程中的那些事二: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


        


  • 大小: 98.4 KB
  • 大小: 56.7 KB
  • 大小: 45.5 KB
0
3
分享到:
评论

相关推荐

    PostgreSQL中文手册9.2

    三、 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 中文手册

    pgAdmin是一款免费的开源软件,专为PostgreSQL设计,提供了直观的界面,使得数据库的管理、查询、备份以及监控等工作变得简单易行。 **1. pgAdmin简介** pgAdmin是PostgreSQL数据库管理员和开发者的理想选择,它...

    PostgreSQL 存储过程调试

    总结来说,调试PostgreSQL存储过程涉及多个层面,从简单的日志记录到复杂的源码调试,都需要对PostgreSQL有深入的理解。熟练掌握这些技巧,将有助于提升数据库应用的稳定性和性能。通过不断实践和学习,你可以成为一...

    Postgresql存储过程

    Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的集合,它可以完成复杂的操作,并且可以重复使用。Postgresql存储过程可以用来实现业务逻辑,减少数据库服务器的压力和网络传输的数据量。 一、存储...

    linux搭建postgresql、postgis、pg_pathman环境步骤以及需要的软件包

    在Linux系统上搭建PostgreSQL、PostGIS和pg_pathman环境是一项关键的任务,这些组件共同构成了一个强大的地理空间数据库解决方案。PostgreSQL是一种开源的关系型数据库管理系统,具有高度的可扩展性和可靠性;...

    dbdpg:Perl Postgres驱动程序DBD :: Pg aka dbdpg

    DBD::Pg作为DBI的子模块,专为PostgreSQL提供服务。 **PostgreSQL与libpq** PostgreSQL,通常简称为Postgres,是一种开源的关系型数据库管理系统(RDBMS),以其高度的稳定性和强大的功能著称。libpq是PostgreSQL...

    Go-PostgreSQLBGWorker用Go编写的PostgreSQL后台工作进程

    在PostgreSQL数据库系统中,后台工作进程(Background Worker)是一种扩展其功能的重要机制。这些进程独立于主要的数据库服务器进程运行,允许开发者实现自定义任务,如定期维护、监控或其他后台服务。Go语言以其...

    postgresql--内核分析--多进程结构

    - `src/backend/utils/misc/pg_shmem.c`文件中实现了共享内存的相关功能,这对于多进程之间的通信非常重要。 #### 五、PostgreSQL与MySQL对比 **1. PostgreSQL文件目录组织**: - 整体代码结构清晰,遵循了良好的...

    postgresql查询死锁以及杀死死锁进程sql.txt

    查询sql的死锁进程,查找并杀死。解决生产数据库中卡死的现象。postgresql查询死锁以及杀死死锁进程sql

    pgadmin3 - 1.14.2 Postgresql 客户端程序

    在本文中,我们将深入探讨pgAdmin3的功能、安装过程以及如何使用它来管理PostgreSQL数据库。 ### pgAdmin3 简介 pgAdmin3 是一个开源的、跨平台的应用程序,适用于Windows、Linux、Mac OS X等多种操作系统。作为...

    PostgreSQL技术内幕:事务处理深度探索.docx

    在本文中,我们将深入探讨 PostgreSQL 的事务处理机制,包括事务的基本概念、事务处理的原理、事务处理的优化方案等。 事务处理在数据库中的重要性 事务处理是数据库系统中非常重要的一个环节,它确保了数据的...

    PostgreSQL获取表名和字段名

    在PostgreSQL数据库管理系统中,获取表名和字段名是数据库管理员和开发人员日常工作中常见的任务。这有助于了解数据库结构,进行数据操作、查询优化或设计新的应用程序。以下是一些关于如何在PostgreSQL中获取这些...

    PostgreSQL教程(十一):服务器配置

    【PostgreSQL教程(十一):服务器配置】 在PostgreSQL中,服务器配置是管理和优化数据库性能的关键环节。本教程主要涵盖服务器进程的启动和关闭以及配置参数的设置。 ### 一、服务器进程的启动和关闭 PostgreSQL...

    关于PostGreSQL中的存储过程

    PostgreSQL 存储过程详解 PostgreSQL 是一个开源的数据库管理系统,它提供了强大的数据存储和管理功能。...本文详细介绍了 PostgreSQL 中的存储过程,并提供了一个使用函数来查询数据的示例代码。

    postgresql-embedded,嵌入式PostgreSQL服务器.zip

    这样的设计对于那些需要在本地或内存中快速访问数据的应用,或者希望减少对外部服务依赖的开发场景特别有用。在【unittests】中使用嵌入式PostgreSQL服务器,可以方便地进行数据库相关的测试,因为无需安装或配置...

    postgresql客户端pgadmin3-1.8.4

    7. **扩展支持**:pgAdmin3能够管理PostgreSQL的各种扩展,如PostGIS(地理空间数据库)、PL/pgSQL(内置过程语言)和其他第三方模块。 8. **多语言支持**:pgAdmin3-1.8.4支持多种语言,包括中文,使得非英语用户...

    presto部署并连接postgresql

    在IT行业中,Presto是一个分布式SQL查询引擎,设计用于快速处理大规模的数据。它支持多种数据源,包括Hadoop Distributed File System (HDFS)、Amazon S3、Cassandra以及我们这里关注的PostgreSQL。本篇文章将详细...

    DBD-Pg-2.15.1

    在实际应用中,DBD::Pg允许开发者执行SQL查询、事务管理、游标操作、结果集处理等常见的数据库操作。使用DBI和DBD::Pg,开发者可以编写可移植的代码,只需更换数据库驱动,就可以轻松地将应用程序从一种数据库系统...

    Postgresql-10安装包

    7. **启动服务**:使用 `pg_ctl` 或者服务管理工具启动 PostgreSQL 服务。 8. **创建第一个数据库和用户**:使用 `createdb` 创建数据库,使用 `createuser` 创建数据库用户,并给予适当的权限。 9. **安装和配置...

    PostgreSQL 14.1 中文手册

    PostgreSQL 14.1 手册 PostgreSQL 全球开发组 翻译:彭煜玮1,PostgreSQL中文社区2文档翻译组

Global site tag (gtag.js) - Google Analytics