在postgre数据库里遇到了虚拟事务virtualtransaction 的概念,请问什么是虚拟事务?

发布于 2022-09-11 23:24:07 字数 820 浏览 31 评论 0

背景

以下是pg_locks表中的段信息
字段名 类型 描述
virtualxid text 作为锁目标的事务虚拟ID,如果目标不是一个虚拟事务ID则此列为空

例子:

locktype  | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid |
virtualtransaction |       pid       |      mode       | granted | fastpath
------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+-
-------------------+-----------------+-----------------+---------+----------
 virtualxid |          |          |      |       | 6/25442    |               |         |       |          |
6/25442            | 140607531513600 | ExclusiveLock   | t       | t

问题

不知道virtualxid所代表对象的信息要去哪个系统表中查询?

在数据库里遇到了虚拟事务的概念,请问什么是虚拟事务?
为什么需要虚拟事务?
虚拟事务有什么好处?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

Hello爱情风 2022-09-18 23:24:07

虚拟事务并不是一个数据库领域的通用概念,它也不是一个面向用户的概念,它是一个纯粹的PG内部的概念。

在PG中,所有的隐式或显式的只读事务都被视作虚拟事务。

PG中之所以要搞出这么一个概念,主要原因是为了性能优化:在早先的版本中(9.0之前?),PG尚未引入虚拟事务的概念时,由于PG内部的所有操作都必然属于一个隐式或显式的事务,因此就会涉及到分配XID(事务ID)的问题。但分配XID会有几个衍生问题:

  1. XID的分配过程是要上锁的(代码中的XidGenLock),一旦涉及到上锁就会有竞争,就会影响性能
  2. XID递增会很频繁

后来发现,其实对于只读事务(无论隐式,还是显式)而言,其实没有必要分配XID。因为只读事务不会去更改数据,所以即使给只读事务分配XID,但是这个XID绝对不会被用于存储层的事务管理中,再加上对于一个OLTP系统而言,大部分应用场景中 读的数量是大于写的,因此出于性能优化的考虑,PG便不再为只读事务分配XID,而是引入了“虚拟事务ID”的概念。分配虚拟事务ID的代价则比分配XID要小得多。

更多关于虚拟事务的来源和概念,可以参考 Gregory Smith的PostgreSQL 9.0性能调校一书,里面有更详尽的阐述。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文