performance - 了解 postgres 中的 virtualxid 事务类型

标签 performance postgresql transactions

我试图理解 postgres 中的锁,这是我到目前为止所理解的。

  • pg_locks 包含锁信息
  • postgres 中的所有语句都在显式/隐式事务内部运行。 (Postgres 9.0 高性能)

根据我的理解,virtualxid 不是真正的交易,而 transactionidxid 表示交易。

当我简单连接到 psql shell 并查询 pg_locks 表时,那里已经存在一个 virtualxid。

我没有发起交易或运行查询,那么为什么要创建这个 virtualxid?是因为这个连接以后可能会发起交易吗?

我在这里错过了什么?

最佳答案

连接不会创建事务,但如果 session 还没有当前打开的事务,则发出 select * from pg_locks 会隐式创建事务。 这是按照您在问题中引用的规则:postgres 中的所有语句都在显式/隐式事务中运行

查询 select * from pg_locks 不能是一个中立的观察者,因为它需要自己使用事务和 pg_locks 上的锁。因此,此选择将​​始终报告至少两个条目,如下例所示:

test=> \x
test=> SELECT relation::regclass AS relname, * FROM pg_locks;

-[ RECORD 1 ]------+----------------
relname            | pg_locks
locktype           | relation
database           | 113270
relation           | 11000
page               | 
tuple              | 
virtualxid         | 
transactionid      | 
classid            | 
objid              | 
objsubid           | 
virtualtransaction | 2/5789
pid                | 31376
mode               | AccessShareLock
granted            | t
-[ RECORD 2 ]------+----------------
relname            | 
locktype           | virtualxid
database           | 
relation           | 
page               | 
tuple              | 
virtualxid         | 2/5789
transactionid      | 
classid            | 
objid              | 
objsubid           | 
virtualtransaction | 2/5789
pid                | 31376
mode               | ExclusiveLock
granted            | t

关于performance - 了解 postgres 中的 virtualxid 事务类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32996020/

相关文章:

python - Django Rest Framework-有效地检索反向外键的相关字段

java - 转换为原始类型或其包装类之间是否存在实际性能差异?

Python postgres 输出格式

iOS:恢复的交易继续到达沙箱

mysql - 什么样的锁定/事务隔离级别适合这种情况?

ruby-on-rails - 我们如何获取 ActiveRecord 事务中创建/更新/回滚记录的数量

performance - PostgreSQL:多表一个条件

ruby - 将 JRuby 用于 Ruby Web 应用程序?这值得么?

sql - 在另一个表中插入行时如何自动增加一个表中的值

sql - Postgres 使用另一行数据更新列