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.*.*(..))" ...
随机推荐
- Struts2简单环境搭建
一.开篇 Struts2是一个运行于web容器的表示层框架,其核心作用是帮助我们处理Http请求.Struts2处理Http请求(Request),并进行内部处理,再进行Http返回. 下载strut ...
- JQuery学习系列篇(二)
1.事件切换函数 hover([over],out); over鼠标移动到元素上要触发的函数,out鼠标移出元素要触发的函数. 2.togger 如果元素是可见的,切换为隐藏的:如果元素是隐藏的,切换 ...
- Windos下的6种IO模型简要介绍
windows进行数据的收发有6种IO模型.分别是阻塞(blocking)模型,选择(select)模型,异步选择(WSAAsyncSelect)模型,事件选择(WSAEventSelect )模型, ...
- Unity Android发布“Bundle Identifier has not been set up correctly”
原文:http://answers.unity3d.com/questions/162141/android-bundle-identifier-has-not-been-setup.html
- logstash配置如何理解?
elasticsearch { action => "index" #The operation on ES hosts => "localhost: ...
- pythone 学习笔记(粗略)
文档目录 概述 安装 基本语法 数据结构 4.1 数字和字符串类型 4.2 元祖 4.3 列表 4.4 字典 流程语句 5.1 分支结构 5.2 逻辑运算符(if) 5.3 循环 5.3.1 for ...
- tyvj1864 [Poetize I]守卫者的挑战
期望dp 不考虑打的顺序,只要最后能把地图都装下就行了,因此把概率和容量装进一个结构体里面,把地图放后面. 记一个状态f[i][j][k]表示前i个比赛,赢了j场,容量k的期望,转移即可. #incl ...
- 三、frpc 完整配置文件
# [common] is integral section [common] # A literal address or host name for IPv6 must be enclosed # ...
- 【henuacm2016级暑期训练-动态规划专题 B】Coloring Trees
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] f[i][j][k]前i个位置,第i个位置放j这个颜色,然后形成了k个联通块的最小花费 分第i个位置有没有已经放颜色两种情况考虑. ...
- [terry笔记]对人员列表文件进行数据库操作
原文件(数据已经脱敏): staff_id,name,age,phone,dept,enroll_date1,姬建明,25,152015410,运维,2013-11-012,刘海龙,26,186184 ...