postgresql中txid_current()中epoch的含义是什么?

时间:2018-03-10 21:29:34

标签: postgresql

https://www.postgresql.org/docs/10/static/functions-info.html#FUNCTIONS-TXID-SNAPSHOT

  

内部事务ID类型(xid)为32位宽,每40亿次事务处理一次。但是,这些函数导出64位格式,该格式使用“epoch”计数器进行扩展,因此在安装期间不会包装

这句话中 epoch 的含义是什么?这是xid达到40亿次交易并被重置为零的次数的反击吗?

我是否正确理解2018-03-09 12:40:56,212 ~~ [CONNECT] ('192.168.1.90', 7687) 2018-03-09 12:40:56,213 ~~ [SECURE] 192.168.1.90 2018-03-09 12:40:56,221 C: [HANDSHAKE] 0x6060B017 [1, 0, 0, 0] 2018-03-09 12:40:56,224 S: [HANDSHAKE] 1 2018-03-09 12:40:56,227 C: INIT ('neo4j-python/1.5.3', {...}) 2018-03-09 12:40:56,228 S: SUCCESS ({'server': 'Neo4j/3.3.2'}) 2018-03-09 12:40:56,229 ~~ [CLOSE] 2018-03-09 12:40:56,231 C: RUN ('BEGIN', {}) 2018-03-09 12:40:56,232 C: PULL_ALL () 2018-03-09 12:40:56,234 C: RUN ('MERGE (a:Person {name: $name}) MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})', {'name': 'Arthur', 'friend_name': 'Guinevere'}) 2018-03-09 12:40:56,234 C: PULL_ALL () 2018-03-09 12:40:56,237 S: SUCCESS ({'result_available_after': 0, 'fields': []}) 2018-03-09 12:40:56,238 S: SUCCESS ({}) 2018-03-09 12:40:56,239 S: SUCCESS ({'result_available_after': 1, 'fields': []}) 2018-03-09 12:40:56,240 S: SUCCESS ({'stats': {'labels-added': 2, 'relationships-created': 1, 'nodes-created': 2, 'properties-set': 2}, 'result_consumed_after': 0, 'type': 'w'}) 2018-03-09 12:40:56,241 C: RUN ('COMMIT', {}) 2018-03-09 12:40:56,241 C: PULL_ALL () 2018-03-09 12:40:56,245 S: SUCCESS ({'result_available_after': 1, 'fields': []}) 2018-03-09 12:40:56,245 S: SUCCESS ({'bookmark': 'neo4j:bookmark:v1:tx829'}) 2018-03-09 12:40:56,246 C: RUN ('BEGIN', {'bookmark': 'neo4j:bookmark:v1:tx829', 'bookmarks': ['neo4j:bookmark:v1:tx829']}) 2018-03-09 12:40:56,247 C: PULL_ALL () 2018-03-09 12:40:56,247 C: RUN ('', {'name': 'Arthur', 'friend_name': 'Lancelot'}) 2018-03-09 12:40:56,248 C: PULL_ALL () 2018-03-09 12:40:56,250 S: SUCCESS ({'result_available_after': 0, 'fields': []}) 2018-03-09 12:40:56,251 S: SUCCESS ({'bookmark': 'neo4j:bookmark:v1:tx829'}) 2018-03-09 12:40:56,251 S: SUCCESS ({'result_available_after': 1, 'fields': []}) 2018-03-09 12:40:56,252 S: SUCCESS ({'stats': {'labels-added': 1, 'relationships-created': 1, 'nodes-created': 1, 'properties-set': 1}, 'result_consumed_after': 0, 'type': 'w'}) 2018-03-09 12:40:56,253 C: RUN ('COMMIT', {}) 2018-03-09 12:40:56,253 C: PULL_ALL () 2018-03-09 12:40:56,256 S: SUCCESS ({'result_available_after': 1, 'fields': []}) 2018-03-09 12:40:56,256 S: SUCCESS ({'bookmark': 'neo4j:bookmark:v1:tx830'}) 2018-03-09 12:40:56,257 C: RUN ('BEGIN', {'bookmark': 'neo4j:bookmark:v1:tx830', 'bookmarks': ['neo4j:bookmark:v1:tx830']}) 2018-03-09 12:40:56,258 C: PULL_ALL () 2018-03-09 12:40:56,259 C: RUN ('', {'name': 'Arthur', 'friend_name': 'Merlin'}) 2018-03-09 12:40:56,259 C: PULL_ALL () 2018-03-09 12:40:56,262 S: SUCCESS ({'result_available_after': 0, 'fields': []}) 2018-03-09 12:40:56,263 S: SUCCESS ({'bookmark': 'neo4j:bookmark:v1:tx830'}) 2018-03-09 12:40:56,264 S: SUCCESS ({'result_available_after': 1, 'fields': []}) 2018-03-09 12:40:56,265 S: SUCCESS ({'stats': {'labels-added': 1, 'relationships-created': 1, 'nodes-created': 1, 'properties-set': 1}, 'result_consumed_after': 0, 'type': 'w'}) 2018-03-09 12:40:56,265 C: RUN ('COMMIT', {}) 2018-03-09 12:40:56,266 C: PULL_ALL () 2018-03-09 12:40:56,269 S: SUCCESS ({'result_available_after': 1, 'fields': []}) 2018-03-09 12:40:56,269 S: SUCCESS ({'bookmark': 'neo4j:bookmark:v1:tx831'}) 2018-03-09 12:40:56,270 C: RUN ('BEGIN', {'bookmark': 'neo4j:bookmark:v1:tx831', 'bookmarks': ['neo4j:bookmark:v1:tx831']}) 2018-03-09 12:40:56,271 C: PULL_ALL () 2018-03-09 12:40:56,271 C: RUN ('MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name RETURN friend.name ORDER BY friend.name', {'name': 'Arthur'}) 2018-03-09 12:40:56,273 C: PULL_ALL () 2018-03-09 12:40:56,275 S: SUCCESS ({'result_available_after': 0, 'fields': []}) 2018-03-09 12:40:56,276 S: SUCCESS ({'bookmark': 'neo4j:bookmark:v1:tx831'}) 2018-03-09 12:40:56,277 S: SUCCESS ({'result_available_after': 1, 'fields': ['friend.name']}) 2018-03-09 12:40:56,277 S: RECORD * 3 2018-03-09 12:40:56,278 S: SUCCESS ({'result_consumed_after': 0, 'type': 'r'}) Guinevere Lancelot Merlin 2018-03-09 12:40:56,279 C: RUN ('COMMIT', {}) 2018-03-09 12:40:56,279 C: PULL_ALL () 2018-03-09 12:40:56,281 S: SUCCESS ({'result_available_after': 0, 'fields': []}) 2018-03-09 12:40:56,282 S: SUCCESS ({'bookmark': 'neo4j:bookmark:v1:tx831'}) 返回64位数字,该数字基本上由连接在一起的两个32位数字组成?前32位是一个纪元计数器(从0开始),最后32位是xid?

我假设当txid_current()达到其最大值时,纪元计数器将被提升为0而xid将重置为0.我认为,这基本上使xid表现得像一个普通的64位数字。

这是怎么回事?我很难理解这一点。

1 个答案:

答案 0 :(得分:0)

Epoch用于防止txid_current()绕回并从零开始(或者精确地从3开始,因为在内部使用的值为0,1,2)。

因此它可以正常工作:

Postgres具有一个内部32位xid计数器,该计数器与txid_current()返回的值不同。内部xid会回绕并在每次回绕时重置其计数。

另一方面,txid_current()返回64位(bigint),其中高位是一个纪元增量,每个xid绕回发生一次,而不是从零开始。

因此,在每个回绕中,纪元都开始出现,并且txid_current()的高位被修改以防止txid重置,取而代之的是txids不断递增,直到达到64bit限制(有时在很久以后我们都死了) )。