PostgreSQL 忘记提交2PC事务对数据库造成的危害.

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:
我在数据库中开启了一个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也无法回收。
源码分析请参考
http://blog.163.com/digoal@126/blog/static/16387704020153305256157/

危害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,及时告警。

[参考]
1. http://blog.163.com/digoal@126/blog/static/1638770402012101423358264
2. http://www.postgresql.org/docs/9.4/static/sql-prepare-transaction.html
3. http://www.postgresql.org/docs/9.4/static/sql-commit-prepared.html
4. http://www.postgresql.org/docs/9.4/static/sql-rollback-prepared.html
5. http://www.postgresql.org/docs/9.4/static/view-pg-prepared-xacts.html
6. http://www.postgresql.org/docs/9.4/static/runtime-config-resource.html#GUC-MAX-PREPARED-TRANSACTIONS
7. http://blog.163.com/digoal@126/blog/static/16387704020153305256157/
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
27天前
|
关系型数据库 分布式数据库 数据库
成都晨云信息技术完成阿里云PolarDB数据库产品生态集成认证
近日,成都晨云信息技术有限责任公司(以下简称晨云信息)与阿里云PolarDB PostgreSQL版数据库产品展开产品集成认证。测试结果表明,晨云信息旗下晨云-站群管理系统(V1.0)与阿里云以下产品:开源云原生数据库PolarDB PostgreSQL版(V11),完全满足产品兼容认证要求,兼容性良好,系统运行稳定。
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB常见问题之数据库不能自己减少节点如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
缓存 关系型数据库 分布式数据库
PolarDB常见问题之数据库cpu突然飙高如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
1月前
|
SQL 关系型数据库 数据库
事务隔离级别:保障数据库并发事务的一致性与性能
事务隔离级别:保障数据库并发事务的一致性与性能
|
1月前
|
算法 大数据 数据库
数据库事务:保障数据一致性的基石
数据库事务:保障数据一致性的基石
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB PostgreSQL版:Oracle兼容的高性能数据库
PolarDB PostgreSQL版是一款高性能的数据库,具有与Oracle兼容的特性。它采用了分布式架构,可以轻松处理大量的数据,同时还支持多种数据类型和函数,具有高可用性和可扩展性。它还提供了丰富的管理工具和性能优化功能,为企业提供了可靠的数据存储和处理解决方案。PolarDB PostgreSQL版在数据库领域具有很高的竞争力,可以满足各种企业的需求。
|
2天前
|
关系型数据库 OLAP 分布式数据库
「杭州*康恩贝」4月26日PolarDB开源数据库沙龙,开启报名!
4月26日周五,PolarDB开源社区联合康恩贝将共同举办开源数据库技术沙龙,本次沙龙我们邀请了众多数据库领域的专家,期待大家的参与!
「杭州*康恩贝」4月26日PolarDB开源数据库沙龙,开启报名!
|
12天前
|
运维 关系型数据库 分布式数据库
「合肥 * 讯飞」4 月 19 日 PolarDB 开源数据库沙龙,报名中!
4月19日周五,PolarDB开源社区联合科大讯飞共同举办开源数据库技术沙龙,本次沙龙我们邀请了众多数据库领域的专家,期待大家的参与!
「合肥 * 讯飞」4 月 19 日 PolarDB 开源数据库沙龙,报名中!
|
22天前
|
程序员 数据库
数据库事务详解2
数据库事务详解
19 0
|
1月前
|
存储 关系型数据库 分布式数据库
PolarDB常见问题之PolarDB突然有大量服务连不上数据库如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。