我试图理解 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/