位置: 编程技术 - 正文

深入理解PostgreSQL的MVCC并发处理方式(深入理解计算机系统)

编辑:rootadmin

推荐整理分享深入理解PostgreSQL的MVCC并发处理方式(深入理解计算机系统),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解ffmpeg pdf,深入理解新发展理念,推进供给侧结构性改革,深入理解中国式现代化,深入理解计算机系统,深入理解计算机系统,深入理解新发展理念,深入理解中国式现代化,深入理解新发展理念,推进供给侧结构性改革,内容如对您有帮助,希望把文章链接给更多的朋友!

Postgre数据库的很大的卖点之一就是它处理并发的方式。我们的期望很简单:读永远不阻塞写,反之亦然。Postgres通过一个叫做 多版本并发控制(MVCC) 的机制做到了这一点。这个技术并不是Postgres所特有的:还有好几种数据库都实现了不同形式的MVCC,包括 Oracle、Berkeley DB、CouchDB 等等 。当你使用PostgreSQL来设计高并发的应用时,理解它的MVCC是怎么实现的很重要。它事实上是复杂问题的一种非常优雅和简单的解法。

MVCC如何工作

在Postgres中,每一个事务都会得到一个被称作为 XID 的事务ID。这里说的事务不仅仅是被 BEGIN - COMMIT 包裹的一组语句,还包括单条的insert、update或者delete语句。当一个事务开始时,Postgrel递增XID,然后把它赋给这个事务。Postgres还在系统里的每一行记录上都存储了事务相关的信息,这被用来判断某一行记录对于当前事务是否可见。

举个例子,当你插入一行记录时,Postgre会把当前事务的XID存储在这一行中并称之为 xmin 。只有那些*已提交的而且 xmin` 比当前事务的XID小的记录对当前事务才是可见的。这意味着,你可以开始一个新事务然后插入一行记录,直到你提交( COMMIT )之前,你插入的这行记录对其他事务永远都是不可见的。等到提交以后,其他后创建的新事务就可以看到这行新记录了,因为他们满足了 xmin < XID 条件,而且创建哪一行记录的事务也已经完成。

对于 DELETE 和 UPDATE 来说,机制也是类似的,但不同的是对于它们Postgres使用叫做 xmax 的值来判断数据的可见性。这幅图展示了在两个并发的插入/读取数据的事务中,MVCC在事务隔离方面是怎么起作用的。

在下面的图中,假设我们先执行了这个建表语句:

虽然 xmin 和 xmax 的值在日常使用中都是被隐藏的,但是你可以直接请求他们,Postgres会高兴的把值给你:获取当前事务的XID也很简单:

深入理解PostgreSQL的MVCC并发处理方式(深入理解计算机系统)

干净利落!

我知道你现在在想:要是同时有两个事务修改同一行数据会怎么样?这就是事务隔离级别(transaction isolation levels)登场的时候了。Postgres支持两个基本的模型来让你控制应该怎么处理这样的情况。默认情况下使用 读已提交(READ COMMITTED) ,等待初始的事务完成后再读取行记录然后执行语句。如果在等待的过程中记录被修改了,它就从头再来一遍。举一个例子,当你执行一条带有 WHERE 子句的 UPDATE 时, WHERE 子句会在最初的事务被提交后返回命中的记录结果,如果这时 WHERE 子句的条件任然能得到满足的话, UPDATE 才会被执行。在下面这个例子中,两个事务同时修改同一行记录,最初的 UPDATE 语句导致第二个事务的 WHERE 不会返回任何记录,因此第二个事务根本没有修改到任何记录:

如果你需要更好的控制这种行为,你可以把事务隔离级别设置为 可串行化(SERIALIZABLE) 。在这个策略下,上面的场景会直接失败,因为它遵循这样的规则:“如果我正在修改的行被其他事务修改过的话,就不再尝试”,同时 Postgres会返回这样的错误信息: 由于并发修改导致无法进行串行访问 。捕获这个错误然后重试就是你的应用需要去做的事情了,或者不重试直接放弃也行,如果那样合理的话。

MVCC的缺点

现在你已经知道MVCC和事务隔离是怎么工作了吧,你获得了又一个工具用来解决这类问题: 可串行化事务隔离级别 迟早会派上用场。然而MVCC的优点虽然很明显但它也存在着一些缺点。

因为不同的事务会看到不同状态的记录,Postgres连那些可能过期的数据也需要保留着。这就是为什么 UPDATE 实际上是创建一行新纪录而 DELETE 并不真正的删除记录(它只是简单的把记录标记成已删除然后设置XID的值)的原因。当事务完成后,数据库里会存在一些对以后的事务永远不可见的记录。它们被称作dead rows。MVCC带来的另外一个问题是,事务的ID只能不断的增加 - 它是个bits,只能”支持大约四十亿个事务。当XID达到最大值后,它会变回零重新开始。突然间所有的记录都变成了发生在将来的事务所产生的,所有的新事务都没有办法访问到这些旧记录了。

上面说到的dead row和事务XID循环问题都是通过执行VACUUM命令(Postgres用来执行清理操作的命令)来解决的。这应该成为一个例行的维护,所以Postgre自带了auto_vacuum守护进程会在一个可配置的周期内自动执行清理。留意点auto_vacuum很重要,因为在不同的部署环境中需要执行清理的周期也会不同。你可以在Postgres的文档里找到关于VACUUM的更多说明。

个postgresql数据库实用命令分享 最初是想找postgresql数据库占用空间命令发现的这篇blog,发现其中提供的几条命令很有用(但也有几条感觉是充数的=。=),于是就把它翻译过来了。另

PostgreSQL ERROR: invalid escape string 解决办法 今天有同事在配置PostgreSQL为Hive元数据库后,运行HiveSQL时遇到以下报错信息:Causedby:MetaException(message:Gotexception:org.apache.hadoop.hive.metastore.api.MetaExceptionjava

CentOS中运行PostgreSQL需要修改的内核参数及配置脚本分享 PostgreSQL在CentOS上部署的时候,需要设置一些操作系统的参数,官方文档上列举了一些(传送门)。除了这些,还有一些其他的设置,如单个用户允许的最

标签: 深入理解计算机系统

本文链接地址:https://www.jiuchutong.com/biancheng/319665.html 转载请保留说明!

上一篇:PostgreSQL新手入门教程

下一篇:15个postgresql数据库实用命令分享

  • MySQL 及 SQL 注入与防范方法(mysql数据库注入)

    3.防止SQL注入

    在脚本语言,如Perl和PHP你可以对用户输入的数据进行转义从而来防止SQL注入。

    PHP的MySQL扩展提供了mysql_real_escape_string()函数来转义特殊的输入字符。

    4.Like语句中的注入

    like查询时,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf" class="img-responsive" alt="MySQL 及 SQL 注入与防范方法(mysql数据库注入)">

    MySQL 及 SQL 注入与防范方法(mysql数据库注入)

  • 解析SQLServer2005的Top功能(解析视频)

    解析SQLServer2005的Top功能(解析视频)

  • NEC笔记本电脑开机进入BIOS的方法(F2+→)(nec笔记本电脑开机屏幕没反应)

    NEC笔记本电脑开机进入BIOS的方法(F2+→)(nec笔记本电脑开机屏幕没反应)

  • swimsuitnetwork.exe - swimsuitnetwork是什么进程 有何作用

    swimsuitnetwork.exe - swimsuitnetwork是什么进程 有何作用

  • Shell脚本实现生成SSL自签署证书(shell脚本生成文件)

    Shell脚本实现生成SSL自签署证书(shell脚本生成文件)

  • 商场购物卡的会员怎么用
  • 所得税会计与财务会计比较研究
  • 对公账户余额和实际不符
  • 医院固定资产折旧率是多少
  • 什么软件属于无线网卡
  • 个体户开票超30次后如何开票
  • 用excel怎么制作思维导图
  • 支票去银行怎么进账
  • 外购原材料自用要进项转出吗
  • 产权转移数据印花税按次申报?
  • 房地产成本核算会计分录
  • 普通股股本属于什么科目
  • 未交税金期末数
  • 税务大厅补报个税怎样申报
  • 企业购进货物若发生下列事项,其增值税进项税额
  • 企业所得税预缴政策
  • 企业当年度增值税税率
  • 推广费是广告费和业务宣传费吗
  • 生产企业开具加工费发票的问题
  • 企业债券收入要在所得税前扣除吗
  • 发票遗失登报费用账务处理
  • 纳税人可以是自然人吗
  • 员工交通费报销标准
  • 固定资产确认的标准有哪些
  • 怎样清理ie
  • 固定资产净值与原值的区别
  • 厂区道路施工步骤
  • 出租商品计入其他业务收入吗
  • win11有什么升级
  • 停止恶意软件删除怎么办
  • 如何进入企业年报系统
  • audit.exe
  • php hash_hmac
  • 受托支付转给个人账户需要交税吗为什么
  • 进项税额大于销项税额期末留抵
  • opengl 图形
  • 织梦如何开启会员功能
  • 报销宽带费属于什么费用
  • 商业收入税收怎么收费
  • 一般纳税人需要报个税吗
  • sql2008使用教程
  • 厂区地面硬化施工方案
  • 未分配利润分配后在报表如何体现
  • 纳税人缴纳的税款叫做什么
  • 应收账款增值税专用发票
  • 信用卡刷卡手续费是谁收取的
  • 建筑材料资源税
  • 营改增后工程结算的账务处理
  • 农产品加计扣除怎么计算
  • 专用发票不抵扣联可以当普票用吗?
  • 附表1是什么意思
  • 固定资产入账标准最新规定企业
  • 应收账款是什么意思
  • mySQL中in查询与exists查询的区别小结
  • 如何修改注册表键值
  • xp系统重启后自动还原怎么办
  • Kaspersky Rescue Disk 2009.04.16 卡巴斯基救援盘
  • ubuntu怎么用
  • 安卓单机手游下载
  • win10系统如何快速打开控制面板
  • windowsxp
  • centos如何设置网卡
  • python sed
  • centos fio
  • linux操作系统的安装
  • win7系统电脑图标不见了
  • centos 安装选择
  • 英雄联盟windows10
  • python gui视频教程
  • iframe的替代方案
  • 细说javascript
  • js null,undefined,字符串小结
  • java模拟浏览器点击
  • js字段截取
  • 税务局服务大厅办办退税要身份证复印件吗
  • 密云到顺义区医院公交路线
  • 网上交车辆购置税怎么交
  • 盐城城南新区的邮政编码是多少号
  • 财政资金存在问题
  • 黄山市国家税务局倪国初
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设