请勿滥用 2PC prepared transaction

我在数据库中开启了一个 2PC事务,但是不去管他,会发生什么呢?有什么危害?

postgres=# begin;
BEGIN
postgres=# insert into t6 values (1);
INSERT 25622 1
postgres=# prepare transaction 'a';
PREPARE TRANSACTION
postgres=# select * from txid_current_snapshot();
     txid_current_snapshot     
-------------------------------
 639903995:639904018:639903995
(1 row)
postgres=# select * from pg_prepared_xacts ;
 transaction | gid |           prepared            |  owner   | database 
-------------+-----+-------------------------------+----------+----------
   639903995 | a   | 2015-09-24 10:03:53.900569+08 | postgres | postgres
(1 row)

危害1, 膨胀
因为vacuum 在回收垃圾时,判断dead tuple可以回收的前提是,dead tuple是在最早未提交事务之前产生的。
所以,在这个事务之后,产生的DEAD TUPLE都无法被回收,即使VACUUM FULL也无法回收。
源码分析请参考

危害2, 年龄
年龄同样会受到威胁,最多只能降低到最早未提交的事务。
例如:

postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database();
 age | datfrozenxid | datname  
-----+--------------+----------
  36 |    639903995 | postgres
(1 row)
无法降低年龄了
postgres=# vacuum freeze;
VACUUM
postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database();
 age | datfrozenxid | datname  
-----+--------------+----------
  36 |    639903995 | postgres
(1 row)
随着事务流逝,年龄越来越大
postgres=# insert into t6 values (1);
INSERT 25655 1
postgres=# insert into t6 values (1);
INSERT 25656 1
postgres=# insert into t6 values (1);
INSERT 25657 1
postgres=# insert into t6 values (1);
INSERT 25658 1
postgres=# insert into t6 values (1);
INSERT 25659 1
postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database();
 age | datfrozenxid | datname  
-----+--------------+----------
  41 |    639903995 | postgres
(1 row)
postgres=# vacuum freeze;
VACUUM
postgres=# select age(datfrozenxid),datfrozenxid,datname from pg_database where datname=current_database();
 age | datfrozenxid | datname  
-----+--------------+----------
  41 |    639903995 | postgres
(1 row)


危害3, 持锁,DDL当然也是下不去的。
包括vacuum full, alter table, ....

最后,还需要提醒,基于流复制的备库, 2PC事务会复制过去,激活后就可以看到。
所以 2PC是非常坚强的,停库后起来还在,切换到备库也还在。
监控必须建立起来,对于长时间不提交的prepared transaction,及时告警。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"decision letter being prepared" 是指正在准备决策信件。当我们收到这样一句话时,通常是指某个机构或组织正在准备一份决策信件,这封信件将通知收信人关于某个重要决策的结果。 通常情况下,决策信件的准备过程包含以下几个步骤: 1. 评估:在准备决策信件之前,相关部门或个人首先会对相关信息进行评估。这可能包括审查个人或团队的申请材料、评估项目进展情况、分析市场状况等。评估的目的是为了确保决策的合理性和可行性。 2. 决策制定:评估完成后,决策者根据所得到的信息和数据,以及个人判断力和经验,进行决策的制定。这个过程可能涉及到多个层面的参与者,决策者可能会与团队成员进行讨论和协商,以确保最终决策的准确性和权衡。 3. 通知准备:一旦决策制定完毕,相关部门或个人将开始准备决策信件。这会包括编写和编辑邮件的具体内容,确保信件的准确传达决策结果、理由和可能的行动计划。 4. 信件发送:最后一步是将准备好的决策信件发送给收信人。这可能涉及到使用邮件系统或电子邮件发送,确保信件的及时送达。在一些情况下,决策者还可能选择与收信人面对面进行沟通,并递交决策信件。 综上所述,"decision letter being prepared" 表示相关机构或组织正在进行决策信件的准备工作,将会通知收信人有关特定决策的结果。这一过程通常经历评估、决策制定、通知准备和信件发送等步骤,以确保准确传达决策结果和可能的行动计划。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值