檢視pg中的鎖

2021-07-10 08:13:23 字數 2400 閱讀 4440

要檢視pg中的鎖,需要檢視pg_locks這個檢視

table 42-37. pg_locks 字段

名字體別

引用描述

locktype

text

可鎖定物件的型別: relation, extend, page, tuple, transactionid, object, 或者 userlock

database

oidpg_database

.oid

物件所在的資料庫的 oid,如果物件是共享物件, 那麼就是零,如果物件是乙個事務 id,就是 null。

relation

oidpg_class

.oid

關係的 oid,如果物件不是關係,也不是關係的一部分,則為 null

page

integer

關係內部的頁面編號,如果物件不是元組頁不是關係頁,則為 null

tuple

smallint

頁面裡面的元組編號,如果物件不是元組,則為 null

transactionid

xid事務的 id,如果物件不是事務 id,就是 null

classid

oidpg_class

.oid

包含該物件的系統表的 oid,如果物件不是普通資料庫物件,則為 null

objid

oid任何 oid 字段

物件在其系統表內的 oid,如果物件不是普通資料庫物件,則為 null

objsubid

smallint

對於表的乙個字段,這是字段編號(classid 和 objid 指向表自身)。 對於其它物件型別,這個欄位是零。如果這個物件不是普通資料庫物件,則為 null

transaction

xid持有此鎖或者在等待此鎖的事務的 id。

pidinteger

持有或者等待這個鎖的伺服器程序的程序 id。  如果鎖是被乙個準備好的事務持有的,那麼為空(null)。

mode

text

這個程序持有的或者是期望的鎖模式(參閱 section 12.3.1)

granted

boolean

如果持有鎖,為真,如果等待鎖,為假

virtualxid:虛擬事務id,每次生成乙個事務,會在pg_clog下的commit log 檔案中占用2bit空間,因為有些事務中沒有實際的 運算元據的語句,所以這種分配事務id有些浪費空間了,於是提出了虛擬事務的概念,主要是為了節省空間。在mysql中針對唯讀事務是有優化的,唯讀事務是沒有分配事務id的。

下面開2個session看下鎖的情況

a:select pg_backend_pid();

9972

建立個表並lock

create table t(id integer);

insert into t values(1);

begin;

lock table t;

b:select * from pg_locks where pid=9972;

看到xid是空的,沒有實際事務,granted是t,表示持有鎖,在b中也試圖lock表看下情況

begin;

lock table t;

一直提示查詢執行中,被阻塞了,在a中檢視下鎖的資訊

看到10732,也就是b回話的granted是f,也就是在發起請求獲得鎖,同時對於b也有virtualxid的exclusivelock鎖,就是對於事務id加了鎖

在a提交後,b就獲得了鎖,但是在a提交後,新開個視窗c,在查詢pg_locks檢視,看到這個c的會話對t表有共享鎖,這個就不太明白了,明明是已經提交了事務,並且c中沒有操作t表,不知道為什麼了

在a中對行操作,看下行鎖是什麼樣的情況

a:begin;

update t set id=5;

看到事務中有了行排他鎖出現,並且出現了transactionid並且xid是625的行,說明這個是有實際資料操作的事務

在b中也更新下行,看下情況

begin;

update t set id=10;

出現了阻塞,看下檢視的情況

看到10732這個會話被阻塞了,要申請的鎖是transactionid625這個鎖,在最後看到625這個鎖是被9972占用了,要檢視那個記錄被占用了

select locktype,relation::regclass as rel,page||','||tuple as ctid,virtualxid as vxid,transactionid as xid,virtualtransaction as vxid2,pid,mode,granted from pg_locks;

select * from t where ctid='(0,4)';

看到是t表中id=4的記錄導致阻塞

pg中的訊息佇列

session1 mydb listen bai listen mydb select pg listening channels pg listening channels bai 1 row session2 mydb notify bai,haha notify mydb select pg ...

事務和鎖 檢視資料庫中的鎖

資料庫加鎖是修改哪一條加鎖,還是在頁上加鎖,還是在表上加鎖,資料庫來決定 如果你更改的是兩條記錄,就在兩條記錄上加鎖,如果你更改的是很多條,這個時候資料庫一看一條一條加鎖太麻煩,給整個頁加鎖更省事,或者給整個表加鎖更加省事 加鎖的級別越大,資料庫越省事,資料庫越省事,併發性越差,修改一條記錄如果給表...

pg表中的系統列

oid 物件id,預設是隱藏不顯示的,在建立表的時候使用了with oids會顯示這個列 select oid.from t test 錯誤 error column oid does not exist sql 狀態 42703 字元 8 create table t test id intege...