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位数字。
这是怎么回事?我很难理解这一点。
答案 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限制(有时在很久以后我们都死了) )。