暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片
从MVCC机制看POSTGRESQL的应用场景.pdf
781
16页
13次
2021-02-23
5墨值下载
MVCC 机制看 POSTGRESQL 的应用场景
PostgreSQL MYSQL 目前用最广泛的个开据库PostgreSQL 为其
克利权方更受一些开源库系发自控的业数平台企业
和用户所青睐。关于 PostgreSQL MYSQL 到底哪个数据库性能好,以及 PostgreSQL 能否
替代 Oracle 数据库,在企业级应用中使用,是大家所关心的问题。本文从 PostgreSQL 的多
版本并发访问MVCC)机制角度,分析 PostgreSQL 较为适合的应用场景。
MVCC Multi-Version Concurrency Control 是多版本
发控。多版本发控的主的是为了高在线事理系(OLTP 系统)中的
作的性能问题
事务与事务隔离是现代关系型数据库的重要基础,通过所需要的事务隔离级别来确保
应用系统读取到的数据是符合业务逻辑的。事务隔离级别包含 read uncommitted(level 0,
)read committed(level 1)repeatable read(level 2)
serializable(level 3,串行化)。其中脏读可以读取任何脏数据,因此不需要任何锁或
其他并发控制机制支持,并发性最好,串行化强制事务串行执行并发能力最弱。提交读-Read
committed 叫一致性读,是目前在线联机事务(OLTP)系统中最为常见的事务隔离级别。
传统的事务理论采用锁机制来实现并发控制,简单的说,写操作使用排它锁,排斥其他
操作;读操作使用共享锁,排斥写操作,但是可以支持其他读操作。随着信息化系统的发展,
并发访问量越大读写锁的对并访问造成的影1981
年位于马萨诸塞州剑桥的美国计算机公司(Computer Corporation of America)的两位技
PHILIP A. BERNSTEIN AND NATHAN GOODMAN
“Concurrency Control in Distributed Database Systems”,这篇以分布式数据库中并
发控制为主要议题的论文中提出了一种全新的并发控制算法基于时间戳顺序的多版本并
发控制机制(SYNCHRONIZATION TECHNIQUES BASED ON TIMESTAMP ORDERING)。这个全新的
并发控制算法为数据库厂商提高并发能力提供了一条心的途径。DEC 公司的 VAX/RDB 是第一
个采用多版本并发控制机制的商用关系型数据库,随后 Oracle 4.0 也开始支持 MVCC,IBM DB2
一直采用其独有的并发控制机制 Generalized Search Tme (GiST),直到 DB2 9.7 才全面支
MVCC。到前为止绝大多数商用和开源数据库都经全面持多版本并发控制机制,
多版本并发控制机制也已经成为交易型关系型数据库的标准配置
Bernstein Goodman 创造性的提出了基 Timestamp Ordering(T/O)的多版本并发
控制理论,对每个写操作记 Timestamp,如下图:
dm-read(95) Timestamp 95
Timestamp 100而小 95 的最大 Timestamp 94么直接读 dm-write(94)的值就可
以了,也就是 Vn-1
不同数据库实现多版本并发制的方是不同的,比 Oracle 库的 T/O 使用
一种时间机制 SCNSystem Change NumberSCN 每个物提的序
格按照时间顺序增长的。PostgreSQL Mysql 则采用了事物 IDXID事物 ID 也是严格
按照时间顺序产生的,因此也满 T/O 的基本要求。 MVCC 的实现粒度方面,Oracle
用的页级通过致读据页Consistent Read BlockCR BLOCK)的
现多版本,而 PostgreSQL Mysql 则采用行级多版本控制机制
Oracle 的多版本并发控制机制一致是业界公认的较为优秀的版本并发控制机制,
特点对读作的持较,在发环有较性能下面将通分析
OraclePostGreSQL Mysql 多并法,种数场景
并发性能。
Oracle 多版并发制是基于 Oracle UNDO/段机的,在回滚段存了某个
数据被修改之前的前映像的数据在每条记录的记录头(kdrh)中,kdrhlock 指向前一次
改该数据的事务槽ITL的位置, ITL 中记录了该次修改的 SCN 信息,以及回滚段的
址信息。其结构如下图:
当某个事务开始的时候,会在回滚段的段头 TRN TBL 中分配一个事务表记录,同时分
配第一个 UNDO 记录,记下事务的一些信息。事务修改某个数据的时候,在该数据 DATA
BLOCK ITL 表中分配一个 ITL 记录,并锁定这 ITL 记录后将数据行头中的 kdrhlock
ITL UNDO
RECORD 中。
如果有事务要读取相关的数据首先对数据库 DB CACHE 缓冲区进行搜索 Oracle
DB CACHE ,同一个数据块可能存在多个版本,这些版本被称为 CR BLOCKS如果
DB CACHE 已经了符条件 CR BLOCK根据 SCN 判断 CR BLOCK 是否
符合查询条件),就可以直接使用,如果没有找到可用 CR BLOCK那么就需要通过
数据块的当前版本(CURRENTBLOCK)来生成所需要的 CR BLOCK
在生成 CR BLOCK 时候,可以根据该行数据的 kdrhlock 找到相关的 ITL 槽,通过比
SCN 判断要读取的数据是数据块中的数据还是修改前的数据。如果发现当前 ITL 槽中
SCN 高于本事务需要读取的 SCN那么就通过 ITL 槽找到该数 UNDO 中的
映像数据PRE-IMAGE通过前映像数据和当前数据生成一个一致性读CR BLOCK
然后通过访问这个 CR BLOCK 找到所需要读的数据。实际环境中可能更为复杂,因为 ITL
槽可会被,在种情Oracle 会把 ITL 息写 UNDO RECORD 中,
个链状结构,可以一层层的找到所需要的 UNDO RECORD,从而完成这种操作。
Oracle 的多本并发制机制使用了一个独立 UNDO 表空间来存储 UNDO 数据
数据的前映像通过在 DB BUFFER 中的 CR BLOCK 来实现,此数据无论修改多少次,
不会对存储数据的数据段产生负面的影响。而且一 CR BLOCK 成后,可以在缓冲区中
较长时间内存在,供相关的事务使用。这个功能对于大并发的读操作来说,是十分有用的,
可以大大提高相关操作的性能。
由于 Oracle UNDO 的空间容量有限此不可能永久保存回滚段的数据,Oracle
UNDO RETENTION 的机制来保护 UNDO 数据,可以设定一定的 UNDO 数据保存周期,
UNDO 据在保护期内,可以保 UNDO 记录不被覆盖。这种机制很好的解决了 UNDO
数据命周理的题,确保在一型查中确所需 PRE-IMAGE 不会
覆盖失效。
PostgreSQL 早期的版本中是不支持多版本并发控制的因此 PostgreSQL 的多版本并
发控制不是通过类似 Oracle 回滚段方式实现的,其实现手段是在数据表中保存某条数据
的多个版本。比如说要对某条记录进行修改并不是直接修改该数据,而是通过插入一条全
新的数据,同时对老数据加以标识删除数据也不是直接删除该数据,是在相应的数据
of 16
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。