PostgreSQL事务篇—— 事务与多版本并发控制MVCC
mhr18 2024-12-27 16:19 15 浏览 0 评论
?、 MVCC常?实现?法
?般MVCC有2种实现?法:
- 写新数据时,把旧数据快照存?其他位置(如oracle的回滚段、sqlserver的tempdb)。当读数据时,读的是快照的旧数据。
- 写新数据时,旧数据不删除,直接插?新数据。PostgreSQL就是使?的这种实现?法。
1. PostgreSQL的MVCC实现?式优缺点
优点
- ?论事务进?了多少操作,事务回滚可以?即完成
- 数据可以进?很多更新,不必像Oracle和MySQL的Innodb引擎需要保证回滚段不会被?完,也不会经常遇到“ORA-1555”错误的困扰
缺点
- 旧版本的数据需要清理。当然,PostgreSQL 9.x版本中已经增加了?动清理的辅助进程来定期清理
- 旧版本的数据可能会导致查询需要扫描的数据块增多,从?导致查询变慢
2. PostgreSQL中MVCC的实现思路
为了实现MVCC机制,必须要:
- 定义多版本的数据——使?元组头部信息的字段来标?元组的版本号
- 定义数据的有效性、可?性、可更新性——通过当前的事务快照和对应元组的版本号判断
- 实现不同的数据库隔离级别——通过在不同时机获取快照实现
?、 基本概念
1. 事务标识
当事务开始(执?begin第?条命令时),事务管理器会为该事务分配?个txid(transaction id)作为唯?标识符。txid是?个32位?符号整数,取值空间??约42亿(2^32-1)。
txid可通过txid_current()函数获取
三个特殊的txid
0:InvalidTransactionId,表??效的事务ID
1:BootstrapTransactionId,表?系统表初始化时的事务ID,?任何普通的事务ID都旧。
2:FrozenTransactionId,冻结的事务ID,?任何普通的事务ID都旧。
?于2的事务ID都是普通的事务ID。
事务间的可?性
txid间可以相互?较??,任何事务只可?txid<其??txid的事务修改结果。但txid并不是?限的,当42亿数据?尽之后?应该如何判断可?性?
2. 元组结构
pg中元组由三部分组成——元组头结点、空值位图、?户数据。
其中与MVCC相关的重要信息为:
t_xmin:保存插?该元组的事务txid(该元组由哪个事务插?)
t_xmax:保存更新或删除该元组的事务txid。若该元组尚未被删除或更新,则
t_xmax=0,即invalid
t_cid:保存命令标识(command id,cid),指在该事务中,执?当前命令之前还执?过?条sql命令(从0开始计算)
t_ctid:?个指针,保存指向??或新元组的元组的标识符(tid)。
当更新该元组时,t_ctid会指向新版本元组。若元组被更新多次,则该元组会存在多个版本,各版本通过t_cid串联,形成?个版本链。通过这个版本链,可以找到最新的版本。
t_ctid是?个?元组(?号,?内偏移量),其中?号从0开始,?内偏移量从1开始。
三、 元组的增、删、改
1. 插?
插?操作最简单,直接将新元组插??标表中??即可
插?操作的过程和结果分析:
- t_xmin 被设置为99,表?插?该元组的txid
- t_xmax 被设置为0,因为该元组还未被更新或删除过
- t_cid 被设置为0,因为这是该事务的第?条命令
- t_ctid 指向??,被设置为(0,1),表?该元组位于0号page的第1个位置上
2. 删除
pg的删除只是将?标元组在逻辑上标为删除(将t_xmax设为执?delete命令的事务txid),实际该元组依然存在于数据库的存储??,直?该元组被清理进程清理掉。
删除操作的过程和结果分析:
- t_xmin 不变,表?插?该元组的txid
- t_xmax 被设置为111,即删除该元组的txid
- t_cid 被设置为0,因为这是该事务的第?条命令
- t_ctid 指向??,被设置为(0,1),表?该元组位于0号page的第1个位置上
当txid=111的事务提交时,tuple_1就不再需要了,称为dead tuple。但是这个tuple依然残留在??上, 随着数据库的运?,这种死元组越来越多,它们会在VACUUM时最终被清理掉。
3. 更新
pg不会直接修改数据,?是将?标元组标记为删除,并插??条新元组,同时修改t_ctid执?新版本元组。
更新操作的过程和结果分析
?先看第?条update:
Tuple_1
- t_xmin 不变,表?插?该元组的txid
- t_xmax 被设置为100,即删除该元组的txid
- t_cid 被设置为0,因为这是该事务的第?条命令
- t_ctid 指向新版本元组,被设置为(0,2),表?新元组位于0号page的第2个位置上
Tuple_2
- t_xmin 被设置为100,表?插?该元组的txid
- t_xmax 被设置为0,因为该元组还未被更新或删除过
- t_cid 被设置为0,因为这是该事务的第?条命令(虽然?删?增,实际都是?条update操作的)
- t_ctid 指向??,被设置为(0,2),表?该元组位于0号page的第2个位置上
再看第?条update:
Tuple_2
- t_xmin 不变,表?插?该元组的txid
- t_xmax 被设置为100,即删除该元组的txid
- t_cid 被设置为1,因为这是该事务的第?条命令
- t_ctid 指向新版本元组,被设置为(0,3),表?新元组位于0号page的第3个位置上
Tuple_3
- t_xmin 被设置为100,表?插?该元组的txid
- t_xmax 被设置为0,因为该元组还未被更新或删除过
- t_cid 被设置为1,因为这是该事务的第?条命令
- t_ctid 指向??,被设置为(0,3),表?该元组位于0号page的第3个位置上
四、 提交?志
pg在提交?志(commit log,CLOG)中保存事务的状态
1. 事务状态
pg定义了四种事务状态——IN_PROGRESS, COMMITTED, ABORTED和SUB_COMMITTED,其中SUB_COMMITTED状态?于?事务,此处不讨论。
四种事务状态仅需两个bit即可记录。以?个块8KB为例,可以存储8KB*8/2 = 32K个事务的状态。内存中缓存CLOG的buffer ??为Min(128,Max(4,NBuffers/512))。
2. ?作原理
CLOG在逻辑上是?个数组,由共享内存中?系列8K??组成。数组下标对应事务txid,数组内容则为事务状态:
- T1时刻:txid=200事务提交,对应状态从IN_PROGRESS改为COMMITED
- T2时刻:txid=201事务回滚,对应状态从IN_PROGRESS改为ABORTED
当需要获取事务状态时,pg调?内部函数读取CLOG返回所请求事务状态.
?
3. CLOG的维护
当shutdown pg或Checkpoint运?时,CLOG数据会由内存写?pg_clog(pg 10后叫pg_xact)?录中的?件。这些?件被命名为0000,0001,最?256KB。当pg启动时,会加载这些?件?于初始化CLOG。
CLOG数据会不断增?,但并?所有数据都是必要的,清理过程也会定期清理掉不再需要的CLOG??和?件。
相关推荐
- 2025最新指南:Quarkus整合Redisson,轻松玩转分布式锁!
-
分布式系统的高并发场景下,如何确保资源操作的原子性和一致性?Redisson作为Redis官方推荐的分布式锁方案,结合Quarkus的云原生特性,能实现高性能、低延迟的分布式锁管理。本文将从原理到实战...
- Linux进程上下文切换过程context_switch详解
-
1前言1.1Linux的调度器组成2个调度器可以用两种方法来激活调度一种是直接的,比如进程打算睡眠或出于其他原因放弃CPU另一种是通过周期性的机制,以固定的频率运行,不时的检测是否有必要因此...
- 开发10年面试过上千人,在网易面试Java程序员,我最爱问这些问题
-
在网易当了3年的面试官,一般在面试Java程序员的时候,我主要会从这几个角度,去问这些问题,在这篇文章中,我会用我上一位面试过程来为大家总结,我面试的时候爱问的这些问题!有需要面试的小伙伴可以参考一下...
- 电影票务APP的“座位锁定”,Redis如何避免冲突?
-
现在买电影票,真是越来越方便了!再也不用提前老半天跑去电影院排队,在手机APP上动动手指,选好场次、挑好座位,在线支付,一气呵成。尤其是遇到热门大片,或者想抢个“皇帝位”(中间靠后视野好的位置),那个...
- Serverless架构下,Redis的用武之地在哪里?
-
在云计算的演进浪潮中,Serverless(无服务器)架构无疑是一颗璀璨的明星。它将传统服务器的运维复杂性彻底“隐藏”起来,开发者只需关注核心业务逻辑,编写一个个独立的函数(Function-as-a...
- 高可用聊天系统设计方案(Hyperf实现)
-
一、系统架构设计1.分层架构图客户端↑↓HTTP/WSAPI网关层(Nginx+Keepalived)↑↓RPC业务服务集群↑↓数据层(MySQLClus...
- 大厂面试冲刺,Java“实战”问题三连,你碰到了哪个?
-
推荐学习全网首发!马士兵内部共享—1658页《Java面试突击核心讲》狂刷《Java权威面试指南(阿里版)》,冲击“金九银十”有望了Java“实战”问题三连Java“实战”面试题1:如果用mybati...
- 企业开发必备的6个Spring Cloud微服务开源项目
-
今天介绍六款比较热门的SpringCloud微服务项目,感兴趣的可以clone下来研究一下,相信对你学习微服务架构很有帮助。一、Cloud-Platform介绍Cloud-Platform是国内首个基...
- 系统架构设计方法论:系统演进的四重境界
-
在架构师面试中,设计能力的考察本质是验证候选人如何将混沌需求转化为可落地的技术方案。这不仅需要扎实的技术功底,更需要系统化的设计思维。以下四大步骤,既是架构设计的核心框架,也是技术决策的动态沙盘推演。...
- 跨浏览器共享Session信息方法总结
-
在不同浏览器之间共享Session信息需要克服浏览器间的隔离机制,常见解决方案如下:1.基于Token的跨浏览器传递实现方式:用户在主浏览器生成临时Token(如加密URL或二维码)。其他浏览器通过...
- 如何设计一套单点登录系统
-
一、介绍昨天介绍了API接口设计token鉴权方案,其实token鉴权最佳的实践场景就是在单点登录系统上。在企业发展初期,使用的后台管理系统还比较少,一个或者两个。以电商系统为例,在起步阶段,可能只有...
- SpringBoot实现单点登录几种方案
-
前言:单点登录(SingleSign-On,SSO)是企业应用系统中常见的用户认证方案,它允许用户使用一组凭证访问多个相关但独立的系统,无需重复登录。基于Cookie-Session的传统SSO方案...
- 零基础小白如何学爬虫技术?看一遍就会的详细教程!
-
你以为爬虫需要精通编程、算法、网络协议才能入门?错了。作为零基础的小白,你完全可以在3周内学会主流网站的数据抓取,核心秘诀就两点:拆分具体目标+倒推式学习。与其纠结Python语法、HTTP协议这...
- 探秘Java中的分布式锁:优雅地协调分布式系统
-
探秘Java中的分布式锁:优雅地协调分布式系统在分布式系统的架构中,数据一致性是一个永恒的挑战。当我们需要在多个节点之间协调某些操作时,分布式锁便成为了一种不可或缺的工具。它就像一把钥匙,能够控制对共...
- 一文读懂 Spring Boot 3 分布式事务解决方案
-
在当今复杂的业务架构中,分布式事务处理是关键难题之一。随着业务规模的不断扩张,系统架构从单体逐渐演进为分布式,这就要求开发人员能够熟练掌握高效的分布式事务解决方案,以保障数据的一致性和业务的稳定性。今...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)