AWS - Redshift - 鎖

AWS Redshift 是雲中數據倉庫服務。通過大規模並行處理、列式數據存儲和非常高效且具有針對性的數據壓縮編碼方案的組合,實現高效存儲和最優查詢性能。

AWS Redshift中有三種鎖定模式:[1]

  • AccessExclusiveLock:主要在 DDL 操作過程中獲取,如 ALTER TABLE、DROP 或 TRUNCATE。AccessExclusiveLock 將阻止其他所有鎖定嘗試。
  • AccessShareLock:在 UNLOAD、SELECT、UPDATE 或 DELETE 操作過程中獲取。AccessShareLock 僅阻止 AccessExclusiveLock 嘗試。AccessShareLock 不會阻止嘗試對錶進行讀取和寫入操作的其他會話。
  • ShareRowExclusiveLock:在 COPY、INSERT、UPDATE 或 DELETE 操作過程中獲取。ShareRowExclusiveLock 阻止 AccessExclusiveLock 和其他 ShareRowExclusiveLock 嘗試,但不會阻止 AccessShareLock 嘗試。

這與一般的RDBMS不一樣

當出現阻塞時,可以通過 以下語句進行查詢,並 kill session。[1]

--查詢鎖
select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a 
left join (select pid,relation,granted from pg_locks group by 1,2,3) b 
on a.relation=b.relation and a.granted='f' and b.granted='t' 
left join (select * from stv_tbl_perm where slice=0) c 
on a.relation=c.id 
left join pg_class d on a.relation=d.oid
where  a.relation is not null;
-- kill session
select pg_terminate_backend(PID);

實驗

Session 1:

testdb=# begin;
BEGIN
testdb=# insert into test_01(id,col1) values (1,'a');
INSERT 0 1
這時不提交,在開啓 session 2 ,並嘗試插入表。
Session 2:
testdb=# begin;
BEGIN
testdb=# insert into test_01 (id , col1) values (2, 'b');

這時發生等待,通過上述SQL查看鎖情況。
開啓監控Session,查看鎖情況

testdb=# select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a
left join (select pid,relation,granted from pg_locks group by 1,2,3) b
on a.relation=b.relation and a.granted='f' and b.granted='t'
left join (select * from stv_tbl_perm where slice=0) c
on a.relation=c.id
left join pg_class d on a.relation=d.oid
where  a.relation is not null;
 txn_owner | txn_db |   xid   |  pid  |         txn_start          |       lock_mode       | table_id |    tablename
    | granted | blocking_pid |        txn_duration
-----------+--------+---------+-------+----------------------------+-----------------------+----------+--------------
----+---------+--------------+-----------------------------
 dbadmin   | testdb | 3539977 | 17056 | 2020-05-28 06:26:53.492043 | AccessShareLock       |    54440 | stv_tbl_perm
    | t       |              | 0 days 0 hrs 0 mins 0 secs
 dbadmin   | testdb | 3539977 | 17056 | 2020-05-28 06:26:53.492043 | AccessShareLock       |    54320 | stv_sessions
    | t       |              | 0 days 0 hrs 0 mins 0 secs
 dbadmin   | testdb | 3539977 | 17056 | 2020-05-28 06:26:53.492043 | AccessShareLock       |   168944 | svv_transacti
ons | t       |              | 0 days 0 hrs 0 mins 0 secs
 dbadmin   | testdb | 3539951 | 22433 | 2020-05-28 06:26:14.038574 | AccessShareLock       |   177033 | test_01
    | t       |              | 0 days 0 hrs 0 mins 39 secs
 dbadmin   | testdb | 3539951 | 22433 | 2020-05-28 06:26:14.038574 | ShareRowExclusiveLock |   177033 | test_01
    | t       |              | 0 days 0 hrs 0 mins 39 secs
 dbadmin   | testdb | 3539961 | 22937 | 2020-05-28 06:26:18.39494  | ShareRowExclusiveLock |   177033 | test_01
    | f       |        22433 | 0 days 0 hrs 0 mins 35 secs
 dbadmin   | testdb | 3539977 | 17056 | 2020-05-28 06:26:53.492043 | AccessShareLock       |    16913 | pg_locks
    | t       |              | 0 days 0 hrs 0 mins 0 secs
 dbadmin   | testdb | 3539977 | 17056 | 2020-05-28 06:26:53.492043 | AccessShareLock       |     1259 | pg_class
    | t       |              | 0 days 0 hrs 0 mins 0 secs
 dbadmin   | testdb | 3539977 | 17056 | 2020-05-28 06:26:53.492043 | AccessShareLock       |    54470 | stv_transacti
ons | t       |              | 0 days 0 hrs 0 mins 0 secs
 dbadmin   | testdb | 3539977 | 17056 | 2020-05-28 06:26:53.492043 | AccessShareLock       |   100382 |
    | t       |              | 0 days 0 hrs 0 mins 0 secs
 dbadmin   | testdb | 3539951 | 22433 | 2020-05-28 06:26:14.038574 | AccessShareLock       |   100382 |
    | t       |              | 0 days 0 hrs 0 mins 39 secs
 dbadmin   | testdb | 3539961 | 22937 | 2020-05-28 06:26:18.39494  | AccessShareLock       |   100382 |
    | t       |              | 0 days 0 hrs 0 mins 35 secs
(12 rows)

回到Session 1,進行Commit。

testdb=# insert into test_01(id,col1) values (1,'a');
INSERT 0 1
testdb=# commit;
COMMIT

看到Session 2中插入成功。

testdb=# insert into test_01 (id , col1) values (2, 'b');
INSERT 0 1

[1] https://amazonaws-china.com/cn/premiumsupport/knowledge-center/prevent-locks-blocking-queries-redshift/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章