关于PostgreSQL的事务快照的延迟

  • 时间:
  • 浏览:0
  • 来源:5分3D官方_极速5分排列5

4)事务快照将会地处滞后

session1:

内部人员事务 ID 类型(xid)是32位,每40亿事务循环。然而哪此函数导出一四个64位格式, 是使用一四个"epoch"计数器扩展,可是在安装过程中不用循环。 哪此函数使用的数据类型txid_snapshot,存储在某时刻事物ID可见性的信息。 其组件描述在Table 9-57。

PostgreSQL提供了几只事务快照函数,实测发现,通过哪此函数取到的事务快照将会要比本人预想的要有一四个延迟。

PostgreSQL将会出于性能的考虑,延迟了快照的更新。每次事务开始时更新一次全局的事务快照,而都在在事务开始时更新快照。而且你这一延迟不影响事务的可见性判断。将会一四个活动的事务没有总出 在事务快照中,表示自你这一事务创建后,还没有地处任何事务提交,也可是事务快照保存的还是你这一事务开始前的状态。进一步,你这一活动的事务ID必然大于等于事务快照的xmax属性,对快照来说这是一四个"未来的"事务,是不可见的,这与活动事务的可见性结果一致。

)。是都在

  1. postgres=# select txid_current();

  2.  txid_current

  3. --------------

  4.       3928129

  5. (1 row)



  6. postgres=# select txid_current();

  7.  txid_current

  8. --------------

  9.       3928150

  10. (1 row)



  11. postgres=# select txid_current_snapshot();

  12.  txid_current_snapshot

  13. -----------------------

  14.  3928131:3928131:

  15. (1 row)

txid_snapshot的文本表示为:xmin:xmax:xip_list。 累似 10:20:10,14,15意思为:xmin=10, xmax=20, xip_list=10, 14, 15。

-----------------------------------------------------------------------------------------------------------

简而言之,PostgreSQL中的事务快照是上一次系统地处事务提交或回滚时的事务快照,而都在获取事务快照时的。

需用注意的是:即使可是,

session2:

3)对不影响数据库状态的查询不用产生新事务ID。

session2:

而且在session2中却看没有你这一事务(事务快照的xmax没有变化)

Table 9-56显示的函数在一四个输出形式中提供服务器事务信息。 哪此函数的主要用途是为了选用在一四个快照之间有哪个事务提交。

session2:

通过在PostgreSQL9.3上实际测试,进一步了解了有些细节。

  1. postgres=# select txid_current_snapshot();

  2.  txid_current_snapshot

  3. -----------------------

  4.  3928129:3928129:

  5. (1 row)



  6. postgres=# select txid_current_snapshot();

  7.  txid_current_snapshot

  8. -----------------------

  9.  3928129:3928129:

  10. (1 row)
3928129是尚未分配的事务ID,两次执行,它的值没有变化。

session1:

1. 功能说明

几只事务快照函数的功能说明参考PostgreSQL手册。

先在session1开一四个事务。

session2:

事务快照中记录的活动事务中也没有带有 自身事务(

  1. postgres=# select txid_current_snapshot();

  2.  txid_current_snapshot

  3. -----------------------

  4.  3928131:3928131:

  5. (1 row)



  6. postgres=# select * from msg limit 1;

  7.    id | msg

  8. --------+--------

  9.  18502 | 18502

  10. (1 row)



  11. postgres=# select txid_current_snapshot();

  12.  txid_current_snapshot

  13. -----------------------

  14.  3928131:3928131:

  15. (1 row)

Table 9-56. 事务ID和快照

http://58.58.27.50:5079/doc/html/9.3.1_zh/functions-info.html

6)任何一四个创建了新事务ID的事务开始时,所有会话的事务快照得到更新

5)事务快照将会不带有 自身事务

1)单独调用txid_current_snapshot()函数,不用产生新的事务

session1:

在可是会话session3中任意提交或回滚一四个需用创建新事务ID的事务,session2就还还可以看完session1的事务了。 session3:

Table 9-57. 快照组件

  1. postgres=# begin;

  2. BEGIN

  3. postgres=# select txid_current_snapshot();

  4.  txid_current_snapshot

  5. -----------------------

  6.  3928132:3928132:

  7. (1 row)

  8. postgres=# select txid_current();

  9.  txid_current

  10. --------------

  11.       3928132

  12. (1 row)



  13. postgres=# select txid_current_snapshot();

  14.  txid_current_snapshot

  15. -----------------------

  16.  3928132:3928132:

  17. (1 row)

把4)引申一下,就会发现事务快照对当前事务也将会地处滞后,即事务快照不带有 自身事务。自身事务从快照看可是一四个“未来的”事务。

在session1开一四个事务,但在session2的事务快照中看没有你这一事务。

2)单独调用txid_current()函数,会产生新的事务

session1提交后,session2的快照得到更新。