布鲁斯·莫姆坚(Bruce Momjian)2020年报告的内容“解锁Postgres锁管理器”。
(注意:您可以通过以下链接从幻灯片中获取所有SQL查询:http : //momjian.us/main/writings/pgsql/locking.sql)
! . , , . , , . . , . , .
. EnterpriseDB Postgres 23 . , . 90 . 40 . , , . . 30 . , 500. . , .
, , Postgres. , , . . 110 . , , .
. – . , - . .
- , . . . . .
- . , .
- . .
- . .
.
. , ? . , « ». 80- , . , , . .
, Oracle. .
, . , SHARE UPDATE ECXLUSIVE. SHARE RAW ECXLUSIVE. , . . «share», – . «exclusive» — . . , .
«» — access. «row» — . . . , .
, Postgres, , , , MVCC. -. , , MVCC – , , . , . .
, – . . , . Postgres . , .
, , , , .
http://momjian.us/main/writings/pgsql/locking.sql
. . SELECT pg_back. ID .
, , , , SQL . PSQL . , .
ID . , . ID Postgres, ID
. , Postgres.
ID – ID , . , SELECT, , , , . , SELECT, ID. ID.
Postgres, , ID . – ID . .
, , ID – 2.
, , , . , 2/10, 2/11, 2/12 . .
, . ID – 2/12. ID . . . ID .
( (ANALYZE)), ID . , . ID, .
, , . – 2/13. ID , , , .
, . ID ID . , Postgres.
. Postgres. . . , , .
, . , , , , , , Postgres.
, Postgres, system view. pg_lock. Pg_lock – , , Postgres.
pg_lock , . view, pg_locks. , . . . , . . SQL , .
, view , – lockview2.
. , . , .
, , Lockdemo. . . , .
, , . ACCESS SHARE. . , .
, «lock table». , . . ACCESS SHARE lock table. PSQL , . . . ? « lockview ». AccessShareLock . , . , . .
, , . .
«SELECT», () AccessShareLock. , . AccessShareLock. SELECT AccessShareLock . , .
SELECT ? , : pg_class, pg_namespace pg_attribute.
, , 9 AccessShareLocks . ? : pg_attribute, pg_class, pg_namespace. , , , AccessShareLock.
, . , , , . . . . , , , AccessShare – , " , ". , , .
ROW SHARE – .
. SELECT ROW SHARE . , .
, , SHARE LOCK? , ID 681 SELECT’. . ? «Lock». ID , , . , , , , - . , . .
, .
, () , . , , .
SHARE EXCLUSIVE – .
(ANALYZE) , .
SHARE LOCK – share.
. SHARE LOCK, . SHARE LOCK.
SHARE LOCK , , . , .
concurrently , , , , concurrently . , , . concurrently , .
SHARE ROW EXCLUSIVE – ().
, . . - , .
EXCLUSIVE , .
.
ACCESS EXCLUSIVE, , . , CLUSTER table
, , . , .
ACCESS EXCLUSIVE, , . , .
, . , ID , ID , ID .
. . . – , Postgres , . , .
.
. -, ExclusiveLock, ID ExclusiveLock .
, ? . . , ? , , . , , Postgres.
, , 100 , 100 . 1 000 , 1 000 . . , . , , , . , , Postgres .
, , , MVCC, . , , Postgres . .
? , , . , . , . , , .
, ? , . , .
, Postgres , MVCC, , Postgres , . Postgres , , , .
- ? , , , , .
, , 1 000 , , 1 000 , , , . . MVCC . , , , , .
?
«», . « », .
. , . .
, shared, 30 .
, , .
, Postgres, – , update select. . select update . , , , , .
. . INSERT. – 694. ID , . , .
ID, – 695.
, 695 .
, . 695 – , update , , .
, – ShareLock, – ExclusiveLock. .
MVCC, , . , , . . SELECT UPDATE.
.
update , . , , , , . . . , . , .
, Lockdemo . . 698.
2-. 699 – . , .
– 2/51 – , . 3/112 – , 3. , , 699. 3/112 . Lock_mode , . 699. , 699, . ? ID. , Postgres . ID. , - , , . .
. ID. ID , lock_type. ? , , ID. , relation. . relation. transactionid, , , , transationid, , 699 .
, . . ID , . , .
6- , , . 699 . 700 . , , 699 .
lock_type, tuple .
, 0/10. , offset .
, 0/11, .
– 0/10, . , , , .
commit, , , . 700 – , , . , . 699 , . 700 , , , , .
, view, . , . , .
, . . .
, , . 3 4.
4. ID 702.
4 5. 5 6, 6 7. , , .
. ? 702. ID, . Granted? f
. , (5, 6, 7) , , ID 702 . ID. 5 ID.
704, 705, , , . , , . , , - , .
, . , 12- .
, . 0/12.
, , , . . . .
, . 702 . 703 , 704 , 703 . 705 . , . , . , . , . , . .
, deadlocks. , . . deadlocks – , , - . , -.
, , : « -», : «, , - ». : «, , ». . , , , - , , . .
, , . , . , . , , .
deadlocks. 50 80. 50 50. 710.
80 81, 50 51.
, . 710 , 711 . , . 710 – . 711 , 710 .
deadlocks. .
80 80.
, deadlocks. 710 711, 711 710. . . .
. .
Postgres , . , . , - SHARE LOCK’ , . . 711 . , SHARE LOCK - ID - . .
deadlocks? ? .
. 40 40, .
60 61, 80 81.
80, – !
714 715. 716- 715- . .
, . - , - , - . , , , .
Postgres . , , , . . , 20 .
– serializable.
serializable .
719. .
, serializable.
, SA – serializable.
, SARieadLock, .
.
.
, 2, 2. 2. , 721- . 722 , 721 , 2 , , 721.
subtransaction.
723.
, ID. , . , ID . 724 . 725.
? , : serializable SAVEPOINT – , .
() , pg_advisory_lock.
, advisory. «advisory». pg_advisory_unlock.
. . pg_locks pg_stat_activity. ? , . , .
pg_stat_view.
. 724. . ? , . . , . , . , – . .
, – pg_blocking_pids
. , , . ? , 11740, ID- . , 11740 724. 724 . 11306 ID-. , . , , . , , ID, , . , ID, , . pg_blocking_pids
.
. 9.6, 5 , . . , .
, . , , . . , . , , !
:
, , . , - intent lock’. Postgres?
. , , , , SELECT, AccessShareLock. . , , , - , AccessShareLock . , . - , .
. . , lock .
lock exclusive, ?
, . , . , , SELECT, ShareExclusive, Row Exclusive, ? . , , , lock, . , , . , . . . , , , .
, . , , . , . . , !
, deadlock’, , ?
Postgres deadlock’. . , , . , , deadlocks… , . 1, 2, 1. deadlocks – , . , , 80 % , . , deadlock’.
! vacuum full , , vacuum full , . vacuum full ?
. , vacuum full . , , . . . , , , , , , . . , . , , , , lock exclusive.
, , , , . . . . lock exclusive.
locking timeout Postgres? Oracle , , « » 50 . . Postgres , - .
, - , locks. no way, …, . lock timeout, , . . , . .
75 ?
.
. 703?
. , , Postgres . 703 , 702. 704 705 , , , , . Postgres : , « ?», -. , . ? 702 703 , . , , . . , .
, Postgres . , f…. , . , 20 , . . . , 703. , . , , , 707, .
, , , 702 703, , , . , , , . , , , , .
, . , , . , , , lock, , . . , , , . . !
, , 705 704.
. , . . ? , 703 ID. , Postgres . 703 ID, , - , 703. , , 703 . - . , . . , . , , , . . , .
问题是我们有CP无穷大。因此,很有可能我们可以唤醒下一个。并且,例如,如果我们唤醒后面的那个,我们将期待刚拿到锁的那个,因此我们无法确定谁将首先被唤醒。我们仅创造了这种情况,系统将以不特定的顺序唤醒它们。
Yegor Rogov有关于锁的文章。看,它们也很有趣而且有用。当然,这个话题非常复杂。非常感谢布鲁斯!