在postgre数据库里遇到了虚拟事务virtualtransaction 的概念,请问什么是虚拟事务?
背景
以下是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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
虚拟事务并不是一个数据库领域的通用概念,它也不是一个面向用户的概念,它是一个纯粹的PG内部的概念。
在PG中,所有的隐式或显式的只读事务都被视作虚拟事务。
PG中之所以要搞出这么一个概念,主要原因是为了性能优化:在早先的版本中(9.0之前?),PG尚未引入虚拟事务的概念时,由于PG内部的所有操作都必然属于一个隐式或显式的事务,因此就会涉及到分配XID(事务ID)的问题。但分配XID会有几个衍生问题:
XidGenLock
),一旦涉及到上锁就会有竞争,就会影响性能后来发现,其实对于只读事务(无论隐式,还是显式)而言,其实没有必要分配XID。因为只读事务不会去更改数据,所以即使给只读事务分配XID,但是这个XID绝对不会被用于存储层的事务管理中,再加上对于一个OLTP系统而言,大部分应用场景中 读的数量是大于写的,因此出于性能优化的考虑,PG便不再为只读事务分配XID,而是引入了“虚拟事务ID”的概念。分配虚拟事务ID的代价则比分配XID要小得多。
更多关于虚拟事务的来源和概念,可以参考 Gregory Smith的PostgreSQL 9.0性能调校一书,里面有更详尽的阐述。