1.idle in transaction
在日常運維過程中通過系統進程經常會看到一些idle in transaction 狀態的連接,對於這種狀態的連接我們怎么判斷是不是僵屍事務呢?還是說此事務狀態有還未提交的信息。
postgres=# select pid, state from pg_stat_activity;
pid |state
-------+---------------------
54168 | idle intransaction
51197 |idle
51983 |active
(11 rows)
2.判斷
在pg_stat_activity中查看idle in transaction 狀態相關的二個狀態backend_xid,backend_xmin 我們通過解讀這個二個狀態來確定是否是僵屍事務
backend_xid:用來表示會話是否申請了事務號
backend_xmin:事務會話的快照ID
如果backend_xid 和backend_xmin 為空,可清理掉該進程, 如果不為空,說明事務還沒結束,如未提交
3.示例
# 會話1
postgres=# begin; -- 執行begin 的時候沒有事務好,只有在開始執行select 等語句時才有事務號
BEGIN
postgres=# select 1;
?column?
----------
1
(1 row)
postgres=# select pg_backend_pid() ;
pg_backend_pid
----------------
28493
#會話2
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_activity where pid=28493 ;
-[ RECORD 1 ]----+------------------------------
datid | 13548
datname | postgres
pid | 28493
usesysid | 10
usename | postgres
application_name | psql
client_addr | 127.0.0.1
client_hostname |
client_port | 28736
backend_start | 2022-02-18 11:45:03.954147+08
xact_start | 2022-02-18 11:52:36.022063+08
query_start | 2022-02-18 11:52:49.399027+08
state_change | 2022-02-18 11:52:49.399425+08
wait_event_type | Client
wait_event | ClientRead
state | idle in transaction
backend_xid |
backend_xmin |
query | select pg_backend_pid() ;
backend_type | client backend
# 注意:
從上面的截圖我們可以看到會話的backend_xid和backend_xmin是空的,因為沒有對數據庫做任何操作所以沒有申請事務號,由於是readcommitted的事務隔離級別,因此目前沒有事務快照信息,backend_xmin為空。
如果后面數據有操作,那么backend_xid會有一個當前事務號或者查詢當前事務號。
#會話1
postgres=# select txid_current();
txid_current
--------------
2170833
(1 row)
# 會話2
postgres=# select * from pg_stat_activity where pid=28493 ;
-[ RECORD 1 ]----+------------------------------
datid | 13548
datname | postgres
pid | 28493
usesysid | 10
usename | postgres
application_name | psql
client_addr | 127.0.0.1
client_hostname |
client_port | 28736
backend_start | 2022-02-18 11:45:03.954147+08
xact_start | 2022-02-18 11:52:36.022063+08
query_start | 2022-02-18 11:54:39.75218+08
state_change | 2022-02-18 11:54:39.752858+08
wait_event_type | Client
wait_event | ClientRead
state | idle in transaction
backend_xid | 2170833
backend_xmin |
query | select txid_current();
backend_type | client backend