要檢視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...