" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PostgreSQL長(zhǎng)事務(wù)概念解析

 更新時(shí)間:2022年09月16日 08:34:08   作者:foucus、  
pg中的長(zhǎng)事務(wù)會(huì)影響表中垃圾回收,導(dǎo)致表的年齡增長(zhǎng)無(wú)法freeze。能消耗事務(wù)的只有當(dāng)執(zhí)行了一些DML或者DDL操作后才能算是我們通常說(shuō)的長(zhǎng)事務(wù)。否則只能算是我們常說(shuō)的長(zhǎng)連接,當(dāng)然長(zhǎng)連接也有很多弊端,例如占用內(nèi)存、cpu等資源

我們?cè)诤芏嗟胤綉?yīng)該都聽(tīng)到過(guò)長(zhǎng)事務(wù)的危害,比方說(shuō)長(zhǎng)事務(wù)會(huì)導(dǎo)致表膨脹之類(lèi)的。那么在PostgreSQL中什么才算是長(zhǎng)事務(wù)呢?

首先,在PostgreSQL的官方文檔中并沒(méi)有所謂“長(zhǎng)事務(wù)”這一定義,似乎大家約定俗稱(chēng)的把一個(gè)執(zhí)行了很長(zhǎng)卻沒(méi)有提交的事務(wù)認(rèn)為是“長(zhǎng)事務(wù)”了,而在不同的數(shù)據(jù)庫(kù)中關(guān)于長(zhǎng)事務(wù)的定義往往也不盡相同,那么在PostgreSQL中什么是長(zhǎng)事務(wù)呢?

打個(gè)比方,如下所示,我在一個(gè)會(huì)話中通過(guò)begin開(kāi)啟一個(gè)事務(wù),然后執(zhí)行了個(gè)簡(jiǎn)單的查詢(xún)語(yǔ)句后遲遲不提交,這算不算長(zhǎng)事務(wù)呢?

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

bill=*#

為了搞清楚這個(gè)問(wèn)題,我們不妨想想,為什么我們會(huì)提到長(zhǎng)事務(wù)呢。這是因?yàn)閜g中的長(zhǎng)事務(wù)會(huì)影響表中垃圾回收,會(huì)導(dǎo)致表的年齡增長(zhǎng)無(wú)法freeze。而我們上面這個(gè)會(huì)話開(kāi)啟的事務(wù)會(huì)有影響嗎?實(shí)際上并不會(huì),我們可以通過(guò)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

之所以會(huì)導(dǎo)致表膨脹之類(lèi)的問(wèn)題,主要是在于backend_xid和backend_xmin兩個(gè)字段,而上面的事務(wù)這兩個(gè)字段均是空的。

/* ----------
 * LocalPgBackendStatus
 *
 * When we build the backend status array, we use LocalPgBackendStatus to be
 * able to add new values to the struct when needed without adding new fields
 * to the shared memory. It contains the backend status as a first member.
 * ----------
 */
typedef struct LocalPgBackendStatus
{
  /*
   * Local version of the backend status entry.
   */
  PgBackendStatus backendStatus;
  /*
   * The xid of the current transaction if available, InvalidTransactionId
   * if not.
   */
  TransactionId backend_xid;
  /*
   * The xmin of the current session if available, InvalidTransactionId if
   * not.
   */
  TransactionId backend_xmin;
} LocalPgBackendStatus;

backend_xid表示已申請(qǐng)事務(wù)號(hào)的事務(wù),例如有增刪改,DLL等操作的事務(wù)。backend_xid從申請(qǐng)事務(wù)號(hào)開(kāi)始持續(xù)到事務(wù)結(jié)束。

backend_xmin表示SQL執(zhí)行時(shí)的snapshot,即可見(jiàn)的最大已提交事務(wù)。

而表膨脹的原因是什么呢?當(dāng)數(shù)據(jù)庫(kù)中存在未結(jié)束的SQL語(yǔ)句或者未結(jié)束的持有事務(wù)ID的事務(wù),在此事務(wù)過(guò)程中,或在此SQL執(zhí)行時(shí)間范圍內(nèi)產(chǎn)生垃圾的話,這些垃圾無(wú)法回收,導(dǎo)致數(shù)據(jù)庫(kù)膨脹。

也就是判斷當(dāng)前數(shù)據(jù)庫(kù)中backend_xid和backend_xmin最小的值,凡是超過(guò)這個(gè)最小值的事務(wù)產(chǎn)生的垃圾都不能回收。

因此,我們?nèi)绻胍O(jiān)控長(zhǎng)事務(wù)該怎么寫(xiě)呢?以超過(guò)1小時(shí)的長(zhǎng)事務(wù)為例:

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;

所以,對(duì)于事務(wù)而言,只有當(dāng)執(zhí)行了一些DML或者DDL操作后才能算是我們通常說(shuō)的長(zhǎng)事務(wù)。否則只能算是我們常說(shuō)的長(zhǎng)連接,當(dāng)然長(zhǎng)連接也有很多弊端,例如占用內(nèi)存、cpu等資源。

在實(shí)際應(yīng)用中,我們應(yīng)當(dāng)做好對(duì)長(zhǎng)事務(wù)的監(jiān)控,并盡可能的避免其發(fā)生。例如一些批量的操作可能會(huì)比較容易導(dǎo)致長(zhǎng)事務(wù),我們可以盡量將其安排在業(yè)務(wù)低峰期執(zhí)行,同時(shí),如果我們的應(yīng)用中關(guān)閉了自動(dòng)提交,也要在執(zhí)行完之后加上提交。

到此這篇關(guān)于PostgreSQL長(zhǎng)事務(wù)概念解析的文章就介紹到這了,更多相關(guān)PostgreSQL長(zhǎng)事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于postgresql行級(jí)鎖for update測(cè)試

    基于postgresql行級(jí)鎖for update測(cè)試

    這篇文章主要介紹了基于postgresql行級(jí)鎖for update測(cè)試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • postgres主備切換之文件觸發(fā)方式詳解

    postgres主備切換之文件觸發(fā)方式詳解

    這篇文章主要介紹了postgres主備切換之文件觸發(fā)方式詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • postgreSQL 使用timestamp轉(zhuǎn)成date格式

    postgreSQL 使用timestamp轉(zhuǎn)成date格式

    這篇文章主要介紹了postgreSQL 使用timestamp轉(zhuǎn)成date格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • postgresql 中的COALESCE()函數(shù)使用小技巧

    postgresql 中的COALESCE()函數(shù)使用小技巧

    這篇文章主要介紹了postgresql 中的COALESCE()函數(shù)使用小技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 在Ubuntu中安裝Postgresql數(shù)據(jù)庫(kù)的步驟詳解

    在Ubuntu中安裝Postgresql數(shù)據(jù)庫(kù)的步驟詳解

    PostgreSQL 是一款強(qiáng)大的,開(kāi)源的,對(duì)象關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)。它支持所有的主流操作系統(tǒng),包括 Linux、Unix(AIX、BSD、HP-UX,SGI IRIX、Mac OS、Solaris、Tru64) 以及 Windows 操作系統(tǒng)。本文給大家介紹了在Ubuntu中安裝Postgresql數(shù)據(jù)庫(kù)的步驟,需要的朋友可以參考下。
    2017-09-09
  • postgresql 中的序列nextval詳解

    postgresql 中的序列nextval詳解

    這篇文章主要介紹了postgresql 中的序列nextval詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • postgresql數(shù)據(jù)合并,多條數(shù)據(jù)合并成1條的操作

    postgresql數(shù)據(jù)合并,多條數(shù)據(jù)合并成1條的操作

    這篇文章主要介紹了postgresql數(shù)據(jù)合并,多條數(shù)據(jù)合并成1條的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • pg中replace和translate的用法說(shuō)明(數(shù)據(jù)少的中文排序)

    pg中replace和translate的用法說(shuō)明(數(shù)據(jù)少的中文排序)

    這篇文章主要介紹了pg中replace和translate的用法說(shuō)明(數(shù)據(jù)少的中文排序),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • postgresql無(wú)則插入,有則更新問(wèn)題

    postgresql無(wú)則插入,有則更新問(wèn)題

    這篇文章主要介紹了postgresql無(wú)則插入,有則更新問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • postgresql 中的to_char()常用操作

    postgresql 中的to_char()常用操作

    這篇文章主要介紹了postgresql 中的to_char()常用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論