关于PostgreSQL的事务快照的延迟

  • 时间:
  • 浏览:1
  • 来源:大发彩神6合_大发神彩6合官方

先在session1开有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,两次执行,它的值非要 变化。

  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)

6)任何有3个 创建了新事务ID的事务结速时,所有会话的事务快照得到更新

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

session2:

session1:

session1:

PostgreSQL由于出于性能的考虑,延迟了快照的更新。每次事务结速时更新一次全局的事务快照,而全部全是在事务结速时更新快照。很久 什儿 延迟不影响事务的可见性判断。由于有3个 活动的事务非要 经常出现在事务快照中,表示自什儿 事务创建后,还非要 所处任何事务提交,也某些某些事务快照保存的还是什儿 事务结速前的具体情况。进一步,什儿 活动的事务ID必然大于等于事务快照的xmax属性,对快照来说这是有3个 "未来的"事务,是不可见的,这与活动事务的可见性结果一致。

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

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

)。是全部全是

session1:

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

前要注意的是:即使原本,

5)事务快照由于不暗含自身事务

把4)引申一下,就会发现事务快照对当前事务也由于所处滞后,即事务快照不暗含自身事务。自身事务从快照看某些某些有3个 “未来的”事务。

4)事务快照由于所处滞后

session2:

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.  184002 | 184002

  10. (1 row)



  11. postgres=# select txid_current_snapshot();

  12.  txid_current_snapshot

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

  14.  3928131:3928131:

  15. (1 row)

3)对不影响数据库具体情况的查询不必产生新事务ID。

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

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

session2:

在session1开有3个 事务,但在session2的事务快照中看非要什儿 事务。

Table 9-56. 事务ID和快照

PostgreSQL提供了几条事务快照函数,实测发现,通过那先 函数取到的事务快照由于要比买车人预想的要有有3个 延迟。

http://58.58.27.400:40079/doc/html/9.3.1_zh/functions-info.html

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

Table 9-57. 快照组件

1. 功能说明

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

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

事务快照中记录的活动事务中也非要 暗含自身事务(

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

  1. postgres=# select txid_current();

  2.  txid_current

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

  4.       3928129

  5. (1 row)



  6. postgres=# select txid_current();

  7.  txid_current

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

  9.       39281400

  10. (1 row)



  11. postgres=# select txid_current_snapshot();

  12.  txid_current_snapshot

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

  14.  3928131:3928131:

  15. (1 row)

很久 在session2中却看非要什儿 事务(事务快照的xmax非要 变化)

在原本会话session3中任意提交或回滚有3个 前要创建新事务ID的事务,session2就时会 能看多session1的事务了。 session3: