時(shí)間:2024-02-28 13:28作者:下載吧人氣:26
我們?cè)诤芏嗟胤綉?yīng)該都聽到過長(zhǎng)事務(wù)的危害,比方說長(zhǎng)事務(wù)會(huì)導(dǎo)致表膨脹之類的。那么在PostgreSQL中什么才算是長(zhǎng)事務(wù)呢?
首先,在PostgreSQL的官方文檔中并沒有所謂“長(zhǎng)事務(wù)”這一定義,似乎大家約定俗稱的把一個(gè)執(zhí)行了很長(zhǎng)卻沒有提交的事務(wù)認(rèn)為是“長(zhǎng)事務(wù)”了,而在不同的數(shù)據(jù)庫(kù)中關(guān)于長(zhǎng)事務(wù)的定義往往也不盡相同,那么在PostgreSQL中什么是長(zhǎng)事務(wù)呢?
打個(gè)比方,如下所示,我在一個(gè)會(huì)話中通過begin開啟一個(gè)事務(wù),然后執(zhí)行了個(gè)簡(jiǎn)單的查詢語(yǔ)句后遲遲不提交,這算不算長(zhǎng)事務(wù)呢?
bill=# begin;
BEGIN
bill=*# select 1;
?column?
———-
1
(1 row)bill=*#
為了搞清楚這個(gè)問題,我們不妨想想,為什么我們會(huì)提到長(zhǎng)事務(wù)呢。這是因?yàn)閜g中的長(zhǎng)事務(wù)會(huì)影響表中垃圾回收,會(huì)導(dǎo)致表的年齡增長(zhǎng)無(wú)法freeze。而我們上面這個(gè)會(huì)話開啟的事務(wù)會(huì)有影響嗎?實(shí)際上并不會(huì),我們可以通過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)致表膨脹之類的問題,主要是在于backend_xid和backend_xmin兩個(gè)字段,而上面的事務(wù)這兩個(gè)字段均是空的。
/* ———-
網(wǎng)友評(píng)論