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.*.*(..))" ...
随机推荐
- JavaScript中数组的迭代方法:forEach、map、filter、reduce、every、some、for in、for of
JavaScript中有非常多数组迭代方法,这里基本上吧所有的都介绍全了,我项目中比较喜欢的是forEach. 7.for in (for-in循环实际是为循环对象而设计的,for in也可以循环数组 ...
- 12 个最佳 GNOME(GTK)主题
作者: Phillip Prado 译者: LCTT 郑 | 2019-04-14 09:45 评论: 1 收藏: 2 让我们来看一些漂亮的 GTK 主题,你不仅可以用在 Ubuntu 上,也可以 ...
- JS中的与冒号的作用、箭头函数相关的一道题
相关知识来自于一道题: 使用ES6的箭头函数语法可以直接省略 function 和 return 关键字,比如 function (){return 1;} 就可以简化成 () => 1 , 但 ...
- [luogu3195 HNOI2008] 玩具装箱TOY (斜率优化dp)
题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具, ...
- 流媒体应用程序Mobdro或存在安全隐患
Mobdro是一款流媒体应用程序,可以安装在任何Android设备上,包括手机,平板电脑,亚马逊的Fire TV Stick和Google的Chromecast.它现在已经流行了一段时间,特别是在围绕 ...
- Django REST Framework 数码宝贝 - 3步进化 - 混合类 -->
读了我这篇博客, 你会刷新对面对对象的认知, 之前的面对对象都是LJ~~~ 表结构 class Publisher(models.Model): name = models.CharField(max ...
- JavaScript实现html页面转换成图片格式
本文提供三个JavaScript插件,并提供对应GitHub地址,自行查看使用方法: 1)dom-to-image:dom-to-image 2)html2canvas:html2canvas 3)r ...
- COGS——T 1175. [顾研NOIP] 旅游电车
http://www.cogs.pro/cogs/problem/problem.php?pid=1175 ★★☆ 输入文件:buss.in 输出文件:buss.out 简单对比时间限制: ...
- 极路由4pro交叉编译c、c++的代码
首先在官方文档中下载SDK 极路由4pro是mtmips架构,即32位mips,小端的,因此下载这个 防止官方的下载链接失效,特意上传到百度网盘: 链接:https://pan.baidu.com/s ...
- Intellij IDEA插件 - Scroll From Source
Intellij IDEA插件 - Scroll From Source 学习了:http://blog.csdn.net/luonanqin/article/details/41088171 可以自 ...