iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL长事务概念解析
  • 649
分享到

PostgreSQL长事务概念解析

2024-04-02 19:04:59 649人浏览 独家记忆
摘要

我们在很多地方应该都听到过长事务的危害,比方说长事务会导致表膨胀之类的。那么在postgresql中什么才算是长事务呢? 首先,在Postgresql的官方文档中并没有所谓“长事务”这一定义,似乎

我们在很多地方应该都听到过长事务的危害,比方说长事务会导致表膨胀之类的。那么在postgresql中什么才算是长事务呢?

首先,在Postgresql的官方文档中并没有所谓“长事务”这一定义,似乎大家约定俗称的把一个执行了很长却没有提交的事务认为是“长事务”了,而在不同的数据库中关于长事务的定义往往也不尽相同,那么在PostgreSQL中什么是长事务呢?

打个比方,如下所示,我在一个会话中通过begin开启一个事务,然后执行了个简单的查询语句后迟迟不提交,这算不算长事务呢?

bill=# begin;
BEGIN
bill=*# select 1;
 ?column?
----------
        1
(1 row)

bill=*#

为了搞清楚这个问题,我们不妨想想,为什么我们会提到长事务呢。这是因为pg中的长事务会影响表中垃圾回收,会导致表的年龄增长无法freeze。而我们上面这个会话开启的事务会有影响吗?实际上并不会,我们可以通过pg_stat_activity视图观察:

bill=# select * from pg_stat_activity where pid = 26192;
-[ RECORD 1 ]----+------------------------------
datid            | 16385
datname          | bill
pid              | 26192
leader_pid       |
usesysid         | 16384
usename          | bill
application_name | psql
client_addr      |
client_hostname  |
client_port      | -1
backend_start    | 2022-03-02 11:49:49.433165+08
xact_start       | 2022-03-02 14:34:04.494416+08
query_start      | 2022-03-02 14:34:06.946754+08
state_change     | 2022-03-02 14:34:06.947207+08
wait_event_type  | Client
wait_event       | ClientRead
state            | idle in transaction
backend_xid      |
backend_xmin     |
query            | select 1;
backend_type     | client backend

之所以会导致表膨胀之类的问题,主要是在于backend_xid和backend_xmin两个字段,而上面的事务这两个字段均是空的。


typedef struct LocalPgBackendStatus
{
  
  PgBackendStatus backendStatus;
  
  TransactionId backend_xid;
  
  TransactionId backend_xmin;
} LocalPgBackendStatus;

backend_xid表示已申请事务号的事务,例如有增删改,DLL等操作的事务。backend_xid从申请事务号开始持续到事务结束。

backend_xmin表示SQL执行时的snapshot,即可见的最大已提交事务。

而表膨胀的原因是什么呢?当数据库中存在未结束的SQL语句或者未结束的持有事务ID的事务,在此事务过程中,或在此SQL执行时间范围内产生垃圾的话,这些垃圾无法回收,导致数据库膨胀。

也就是判断当前数据库中backend_xid和backend_xmin最小的值,凡是超过这个最小值的事务产生的垃圾都不能回收。

因此,我们如果想要监控长事务该怎么写呢?以超过1小时的长事务为例:

select count(*) from pg_stat_activity where state <> 'idle' 
and (backend_xid is not null or backend_xmin is not null) 
and now()-xact_start > interval '3600 sec'::interval;

所以,对于事务而言,只有当执行了一些DML或者DDL操作后才能算是我们通常说的长事务。否则只能算是我们常说的长连接,当然长连接也有很多弊端,例如占用内存、cpu等资源。

在实际应用中,我们应当做好对长事务的监控,并尽可能的避免其发生。例如一些批量的操作可能会比较容易导致长事务,我们可以尽量将其安排在业务低峰期执行,同时,如果我们的应用中关闭了自动提交,也要在执行完之后加上提交。

到此这篇关于PostgreSQL长事务概念解析的文章就介绍到这了,更多相关PostgreSQL长事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL长事务概念解析

本文链接: https://www.lsjlt.com/news/34048.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL事务的基本概念解析
    MySQL事务的基本概念解析 MySQL是一种常用的关系型数据库管理系统,支持事务处理。事务是数据库操作的基本单位,通过事务可以保证一系列操作的原子性、一致性、隔离性和持久性。本文将详...
    99+
    2024-03-01
    mysql 事务 概念
  • Go语言基础概念解析
    go 语言是一门高性能、并发编程语言,其基础概念包括:基本类型(整数、浮点数、布尔值、字符串、字符);通过 var 关键字声明变量,并支持类型推断;使用 const 关键字声明常量;提供...
    99+
    2024-04-08
    go语言 基础概念
  • PostgreSQL DBA(27) - MVCC#7(避免长事务)
    对于Update/De...
    99+
    2024-04-02
  • 解析PHP SDK的概念与功能
    PHP SDK(Software Development Kit)是为了方便开发人员与特定平台进行交互而提供的一组工具、函数和方法的集合。它提供了一种简单而高效的方式来与特定平台的AP...
    99+
    2024-03-09
    php sdk 解析
  • MongoDB数据库基本概念解析
    在上一篇文章中讲解了如何安装MongoDB,这篇文章中讲解一些有关MongoDB的概念。 不管我们要学习什么数据库,都应该学习其中的基础概念,在MongoDB中基本的概念是文档、集合...
    99+
    2024-04-02
  • 解析PHP中的多态性概念
    PHP中的多态性概念及代码示例 在面向对象编程中,多态性是一种重要的概念,它使得不同对象可以对同一消息作出不同响应。在PHP中,多态性可以通过接口和继承来实现。接下来我们将通过具体的代...
    99+
    2024-04-02
  • MYSQL事务以及隔离级的概念
    这篇文章主要介绍“MYSQL事务以及隔离级的概念”,在日常操作中,相信很多人在MYSQL事务以及隔离级的概念问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MYSQL事务以及隔...
    99+
    2024-04-02
  • Java线程安全基础概念解析
    Java线程安全初步了解。JAVA线程安全从总体上来说,是指Java对象在多线程运行环境下的一种特性,表现为常规(区别于特殊调用情况)情况下每次调用都能得到正确的逻辑结果。从本质上来说,将对象的方法行为加上了同步控制逻辑,而调用者无须做其他...
    99+
    2023-05-31
    java 线程安全 ava
  • MySQL事务的概念以及事务隔离级别介绍
    本篇内容主要讲解“MySQL事务的概念以及事务隔离级别介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL事务的概念以及事务隔离级别介绍”吧!先简单介绍...
    99+
    2024-04-02
  • mysql设计概念、多表查询和事务操作实例分析
    本篇内容介绍了“mysql设计概念、多表查询和事务操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • java事务、事务的隔离级别的概念是什么
    本篇内容介绍了“java事务、事务的隔离级别的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是事务?  事务,即数据库事务。是...
    99+
    2023-06-02
  • bloom filter概念讲解以及代码分析
    一. 简介1.什么是bloom filter?Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检...
    99+
    2022-11-15
    bloom_filter
  • Docker基本概念和底层原理解析
    目录1、Docker的底层原理2、Docker中常用的基本概念3、run命令的运行流程4、为什么Docker比VM快Docker架构图: 我们依照Docker架构图进行Docker基...
    99+
    2024-04-02
  • Golang函数指针和闭包:概念解析
    摘要:1. 什么是函数指针?函数指针是存储函数地址的变量,允许将函数作为另一个函数的参数。2. 什么是闭包?闭包是对函数附加数据的函数,它捕捉到函数被调用时的作用域变量,使函数可以引用外...
    99+
    2024-04-15
    闭包 函数指针 golang 作用域
  • 深入解析Go语言中的str概念
    Go语言是一门非常流行的编程语言,它的设计简洁高效,深受广大开发者喜爱。在Go语言中,有一个非常重要的概念就是字符串(string),在本文中我们将深入解析Go语言中的字符串概念,并结...
    99+
    2024-04-02
  • C++语法中易混淆的概念解析
    混淆概念解析:指针和引用: 指针存储变量地址,引用直接指向变量。值传递和引用传递: 值传递副本,引用传递引用。const和constexpr: const为运行时常量,constexpr...
    99+
    2024-05-13
    c++ 语法 概念
  • PHP值传递的概念及原理解析
    PHP值传递的概念及原理解析 在PHP编程中,值传递是一种常用的参数传递方式。在理解值传递的概念和原理之前,我们先来了解一下PHP中的变量传递方式。PHP中的变量传递方式主要分为值传递...
    99+
    2024-03-09
    原理 php 值传递
  • 如何进行Ruby特殊语法概念解析
    小编今天带大家了解如何进行Ruby特殊语法概念解析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“如何进行Ruby特殊语法概念解析”的...
    99+
    2023-06-17
  • PHP值解析:详解PHP中值的概念及应用
    PHP值解析:详解PHP中值的概念及应用 在PHP编程中,值是一个非常基础且重要的概念。在本文中,我们将深入探讨PHP中值的概念及其在实际编程中的应用。我们将从基本值类型,变量,数组,...
    99+
    2024-04-02
  • 揭秘 Django 的视图函数:核心概念解析
    视图函数结构 视图函数通常定义为 Python 函数,并接受一个 HttpRequest 对象作为参数。这个对象封装了有关请求的信息,例如请求方法、头和。视图函数会返回一个 HttpResponse 对象,它代表服务器对请求的响应。以下...
    99+
    2024-02-16
    : Django 视图函数 HTTP 请求 响应 处理函数 装饰器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作