PostgreSQL 事务管理的MVCC
PostgreSQL的并发控制机制同时实现了多版本控制MVCC协议和两阶段封锁协议。实际采用哪种协议取决于所执行的语句类型。
DML语句的并发控制将使用MVCC协议;
DDL语句的并发控制基于标准的两阶段封锁协议。
MVCC的关键思想是维护每一行的不同版本,而不同版本对应着在不同的时间点该行的不同实例。MVCC协议确保每个事务都只看到与事务的数据库视图一致的版本的数据;每个事务看到数据的一个快照,只包含那些在事务启动时已提交的数据。这个快照并不等于数据的当前状态。
使用MVCC的目的 是让读操作不阻塞写操作,写操作不阻塞都操作。读操作访问属于该事务快照的一部分的最近一个版本的行。写操作创建他们独有的隔离的行副本,用于更新。只有两个写操作视图同时更新相同行时,才会出现使得事务阻塞的冲突。相反,使用标准的两阶段时,读操作和写操作都可能被阻塞,因为每个数据库对象只有一个版本,读操作和写操作在访问任何数据前都需要获得相应的锁。
PostgreSQL MVCC的核心是元组的可见性。PostgreSQL的元组指某行的一个版本。元组对事务可见指每个事务都只能访问在其开始运行时已经提交的数据。元组对事务可见的条件:
一个事务标识即transaction ID,在事务启动时分配给每一个事务,同时起到时间戳的作用。
一个叫pg_clog的日志文件,包含每个事务的当前状态。状态分为:处理中,已提交,已中止。
表中每个元组都包含有一个元组头,三个域:
xmin:包含创建该元组的事务标识,又称为创建事务标识(creation-transaction ID);
xmax:包含替换或删除该元组的事务标识(如果没有替换或删除则为null),又称为终止事务标志(expire-transaction ID);
指向相同逻辑行的新版本的前向连接,如果存储。
另外cmin和cmax 标识在同一个事务中多个语句命令的序列值,从0开始,用于同一个事务中实现版本可见性判断。

一个snapshotdata数据结构在事务启动时或查询启动时创建,这取决于隔离级别。snapshotdata数据结构包含在取得快照时所有活跃的事务的列表。
PostgreSQL MVCC带来的影响:
1.给存储管理器带来了额外的负担,因为需要维护元组的不同版本;
2.开发并发应用需要更小心些,因为与使用标准的两阶段封锁协议的系统相比,PostgreSQL MVCC在并发事务运行方式方面带来了一些不同;
3.PostgreSQL的性能取决于运行在其上的工作负载的特点。
创建和存储每一行的多个版本会带来昂贵的存储开销。为了减轻这个问题,PostgreSQL周期性地识别和删除那些不再需要的行的版本,从而释放空间。这个功能以vacuum命令的形式实现。vacuum命令作为一个后台进程运行,也能被用户直接调用。
vacuum命令提供不同的操作模式:
普通的vacuum简单地回收那些不再使用的行所占用的空间,并使这些空间可以重用。这种形式的命令可以和表的普通读写并行执行。
vacuum full命令做了更广泛的处理,包括在块之间移动元组,试图把表压缩到最小数目的磁盘块。这种形式会慢很多,同时对于每一个正在处理的表都需要一个排他锁。
带可选参数analyze调用vacuum时,他将收集正在清理的那些表的内容的统计数据。素以统计结果用来更新pg_statistic系统表,从而允许PostgreSQL查询规划器在规划查询时做更好的选择。
PostgreSQL 事务管理的MVCC的更多相关文章
- PostgreSQL事务实现
事务简介 事务管理器:有限状态机 日志管理器 CLOG:事务的执行结果 XLOG:undo/redo日志 锁管理器:实现并发控制,读阶段采用MVCC,写阶段采用锁控制实现不同的隔离级别 Postgre ...
- spring事物配置,声明式事务管理和基于@Transactional注解的使用
http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...
- 24Spring_事务管理机制
第一部分:Spring事务管理高层抽象接口 我们介绍三个接口:1.PlatformTransactionManager 2.TransactionDefinition 3.TransactionSt ...
- spring+mybatis事务管理
spring+mybatis事务管理 最近在和朋友做一个项目,考虑用springmvc+mybatis来做,之前在公司工作吧,对于数据库这块的配置也有人再弄,最近因为这个项目,我就上网学习了一些关于数 ...
- spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...
- 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- 关系型数据库工作原理-事务管理(一)(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- java版云笔记(七)之事务管理
事务管理 事务:程序为了保证业务处理的完整性,执行的一条或多条SQL语句. 事务管理:对事务中的SQL语句进行提交或者回滚. 事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...
- Spring事务管理—aop:pointcut expression 常见切入点表达式及事物说明
例: <aop:config> <aop:pointcut expression="execution(* com.xy.service.*.*(..))" ...
随机推荐
- Swagger 隐藏具体API
一.why 在swagger ui界面中有时候不想显示某些api,通过下面的方式可以实现. 1.1.新建一个类实现IDocumentFilter接口 using Swashbuckle.Swagger ...
- 微信小程序中获取高度及设备的方法
由于js中可以采用操纵dom的方法来获取页面元素的高度,可是在微信小程序中不能操纵dom,经过查找之后发现仅仅只有以下几个方法可以获取到高度 wx.getSystemInfoSync().window ...
- SQL Server-聚焦聚集索引对非聚集索引的影响
前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没 ...
- python3配置爬虫开发环境
爬虫:环境搭建 安装python3: 安装python版本:3.7.0 winsdows下的配置:
- Codeforces Round #470 (rated, Div. 2, based on VK Cup 2018 Round 1)A. Protect Sheep
http://codeforces.com/contest/948/problem/A A. Protect Sheep Bob is a farmer. He has a large pastu ...
- jQuery Validate验证(项目中使用的)
大致结构是: <script type="text/javascript" src="<%=path %>/js/jquery-1.9.1.min.js ...
- org.apache.hadoop.ipc.Client: Retrying connect to server
这个问题导致jps查看结点进程时发现找不到NodeManager或一段时间后消失,网上查找了很多博客,因hadoop版本不一样且出错的原因也可能不同,所以找了老半天. 步骤:jps --> 看l ...
- cocos2d-x学习笔记(18)--游戏打包(windows平台)
cocos2d-x学习笔记(18)--游戏打包(windows平台) 之前做好的游戏,都是在vs2008下编译执行的.假设说想把游戏公布到网上或者和其它人一起分享游戏,那就得对游戏 ...
- Tokyo Tyrant(TTServer)系列(二)-启动參数和配置
启动參数介绍 ttserver命令能够启动一个数据库实例.由于数据库已经实现了Tokyo Cabinet的抽象API,所以能够在启动的时候指定数据库的配置类型. 支持的数据库类型有: ...
- uva725_一道水题(优化到了29ms)
//////////////////////////////////////////////////////////////////////////////////////////////////// ...