了解postgres中的virtualxid事务类型

Gre*_*der 3 postgresql performance transactions

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

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

根据我的理解,virtualxids不是真正的事务,transactionidxid是表示事务的东西.

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

我没有启动事务或运行查询,为什么要创建这个virtualxid?是因为这个连接可能在将来启动交易吗?

我在这里错过了什么?

Dan*_*ité 6

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


Ego*_*gov 5

只要您查询 pg_locks,您实际上就是在运行一个查询并因此启动一个事务。例如,它需要在 pg_locks 上获取 AccessShareLock。这就是分配 virtualxid 的原因。

但与真实交易 ID 不同,虚拟交易 ID 是相当“免费”的。Virtualxid 是后端本地的(它由后端编号加上一些序列号组成)。并且真实交易 id 是系统范围的 32 位数字,因此当计数器回绕为零时有可能回绕。必须采取特殊措施来防止系统在那一刻发生故障,因此 PostgreSQL 不愿意在实际需要之前分配真实的事务 ID。