SlideShare a Scribd company logo
澤田 雅彦
@PostgreSQLアンカンファレンス
「LOG: process 12345 still waiting for ShareLock on
transaction 710 after 1000.269 ms」
のログについて
2
• 行ロック取得時(SELECT … FOR UPDATEなど)に、既に行ロックを取得しているトランザクションの完了(=
行ロックの開放)を待つときに出るログ
• トランザクションIDへのロックとは?
• それがなぜ行ロックに関係しているのか?
• 一方、LOG: process 58992 still waiting for AccessExclusiveLock on tuple (0,1) of relation 16384 of database
13021 after 1000.256 ms というログも出る
• FOR UPDATEのケースのみ解説します
LOG: process 61648 still waiting for ShareLock on transaction 710 after 1000.269 ms
DETAIL: Process holding the lock: 59735. Wait queue: 61648.
CONTEXT: while locking tuple (0,1) in relation "test"
3
ロックマネージャ(lmgr)
• ロックを管理する内部コンポーネント(すべてのプロセスで共有している)
• リレーション, タプル, ページ, トランザクションIDなど様々なものに対してロックが取得できる
• pg_locksビューで中身が見れる
• デッドロック検知機能がついている(deadlock_timeout)
• ロック待ちが発生するとログを出す(log_lock_waits)
• ロックは、スピンロック、軽量ロック、SIロックなど他にも色々ある
4
ロックレベル
5
トランザクションIDへのロック
• トランザクションID=各トランザクションが持つ一意の非負整数値
• トランザクションIDが払い出されたら、各トランザクションは自分のトランザクション
IDに対して排他ロックを取得する
• 自分のトランザクションIDに対する排他ロックはトランザクション完了時に開放される
6
トランザクションIDへのロック待ちとは?
LOG: process 61648 still waiting for ShareLock on transaction 710 after 1000.269 ms
• あるトランザクションIDへの共有ロックが取得できた=そのトランザクションが完了し
た
• 行ロックはこれを利用している
• つまりこのログは「あるトランザクション(xid=710)が先に行ロックを取得していて、プ
ロセス(pid=61648)はそのトランザクションが行ロックを開放するのを待っている」と理
解できる
7
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く
BE-1
BE-2
Lmgr
Tuple
8
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く
BE-1
BE-2
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
9
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く
BE-1
BE-2
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
10
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
11
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く
BE-1
BE-2
100
XID=100
XID=200
XID=100

EXL (BE-1)
XID=200

EXL (BE-2)
Lmgr
Tuple
12
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く
BE-1
BE-2
100
XID=100
XID=200
XID=100

EXL (BE-1)
XID=200

EXL (BE-2)
Lmgr
Tuple
13
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く
BE-1
BE-2
100
XID=100
XID=200
XID=100

EXL (BE-1)
XID=200

EXL (BE-2)
Lmgr
Tuple
SHL (BE-2)
14
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く BE-2
100
XID=200
XID=200

EXL (BE-2)
Lmgr
Tuple
XID=100

SHL (BE-2)
15
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く BE-2
100
XID=200
XID=200

EXL (BE-2)
Lmgr
Tuple
16
ざっくりとした流れ
1. 自分のトランザクションIDに排他ロックを
取得
2. タプルのXMAXを確認して行ロックを取得
しているトランザクションを確認
3. 行ロックを取得しているトランザクション
の完了を待つ(=XIDへの共有ロックの取得)
4. 自分のXIDをXMAXに書く BE-2
200
XID=200
XID=200

EXL (BE-2)
Lmgr
Tuple
17
実はこれだけではうまく動かない
• 後から待ち始めたトランザクションが先に行ロックを取得できてしまう
18
行に対するロックをlmgr上で取得する
1. 自分のトランザクションIDに排他ロックを取得
2. 対象となる行に対してAccessExclusiveLockを取得
3. タプルのXMAXを確認して行ロックを取得しているトランザクションを確認
4. 行ロックを取得しているトランザクションの完了を待つ(=XIDへの共有ロックの取得)
5. 自分のXIDをXMAXに書く
6. 2で取得したAccessExclusiveLockを開放
19
BE-1
BE-2
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
20
BE-1
BE-2
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
21
BE-1
BE-2
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
tuple=(0,1)

AEL (BE-1)
22
BE-1
BE-2
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
tuple=(0,1)

AEL (BE-1)
23
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
tuple=(0,1)

AEL (BE-1)
24
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
25
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=200
XID=200

EXL (BE-2)
26
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=200
XID=200

EXL (BE-2)
tuple=(0,1)

AEL (BE-2)
27
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=200
XID=200

EXL (BE-2)
tuple=(0,1)

AEL (BE-2)
SHL (BE-2)
28
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=200
XID=200

EXL (BE-2)
tuple=(0,1)

AEL (BE-2)
SHL (BE-2)
LOG: process 61648 still
waiting for ShareLock on
transaction 710 after
1000.269 ms
29
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=200
XID=200

EXL (BE-2)
tuple=(0,1)

AEL (BE-2)
SHL (BE-2)
BE-3
XID=300
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=300

EXL (BE-3)
30
BE-1
BE-2
100
XID=100
XID=100

EXL (BE-1)
Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=200
XID=200

EXL (BE-2)
SHL (BE-2)
BE-3
XID=300
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
AEL (BE-3)
tuple=(0,1)

AEL (BE-2)
XID=300

EXL (BE-3)
31
BE-1
BE-2
100
XID=100 Lmgr
Tuple
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=200 BE-3
XID=300
1. Acquire the XID lock in EXL

2. Acquire the tuple lock in AEL

3. Check the blocker

4. Wait for the blocker to finish

5. Write own XID to XMAX field

6. Release the tuple lock
XID=100

EXL (BE-1)
XID=200

EXL (BE-2)
SHL (BE-2) AEL (BE-3)
tuple=(0,1)

AEL (BE-2)
XID=300

EXL (BE-3)
LOG: process 58992 still
waiting for
AccessExclusiveLock on
tuple (0,1) of relation
32
まとめ
• トランザクションは自分のトランザクションIDに対して排他ロックを取得する
• トランザクションIDに対する共有ロックの要求=そのトランザクションの完了待ち
• 最初に行ロックを待つトランザクションはトランザクションIDへの共有ロック待ちでログを出す
• それ以降に行ロックを待つトランザクションはタプルへの排他ロック待ちでログを出す
• タプルに対して(lmgr上で)AELを取得する事で待ち順を制御する
• 自分のブログでも以前にまとめています

トランザクションIDへのロックと行ロック: https://masahikosawada.github.io/2018/09/04/Row-locking-and-locking-on-
transactionid/

More Related Content

What's hot (20)

PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Hironobu Suzuki
 
PDF
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLの関数属性を知ろう
kasaharatt
 
PDF
PostgreSQLでスケールアウト
Masahiko Sawada
 
PPTX
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
NTT DATA Technology & Innovation
 
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
DockerとPodmanの比較
Akihiro Suda
 
PPTX
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLの運用・監視にまつわるエトセトラ
NTT DATA OSS Professional Services
 
PDF
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
 
PDF
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
NTT DATA Technology & Innovation
 
PDF
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 
PDF
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLバックアップの基本
Uptime Technologies LLC (JP)
 
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Hironobu Suzuki
 
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLの関数属性を知ろう
kasaharatt
 
PostgreSQLでスケールアウト
Masahiko Sawada
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
NTT DATA Technology & Innovation
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
DockerとPodmanの比較
Akihiro Suda
 
MongoDBが遅いときの切り分け方法
Tetsutaro Watanabe
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
NTT DATA Technology & Innovation
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
NTT DATA Technology & Innovation
 
PostgreSQLの運用・監視にまつわるエトセトラ
NTT DATA OSS Professional Services
 
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
NTT DATA Technology & Innovation
 
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 
YugabyteDBを使ってみよう - part2 -(NewSQL/分散SQLデータベースよろず勉強会 #2 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLバックアップの基本
Uptime Technologies LLC (JP)
 
2025年現在のNewSQL (最強DB講義 #36 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 

More from Masahiko Sawada (20)

PDF
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
PDF
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
PDF
Transparent Data Encryption in PostgreSQL
Masahiko Sawada
 
PDF
PostgreSQL 12の話
Masahiko Sawada
 
PDF
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -
Masahiko Sawada
 
PDF
Transparent Data Encryption in PostgreSQL and Integration with Key Management...
Masahiko Sawada
 
PDF
Bloat and Fragmentation in PostgreSQL
Masahiko Sawada
 
PDF
Database Encryption and Key Management for PostgreSQL - Principles and Consid...
Masahiko Sawada
 
PDF
今秋リリース予定のPostgreSQL11を徹底解説
Masahiko Sawada
 
PDF
Vacuum more efficient than ever
Masahiko Sawada
 
PDF
Vacuumとzheap
Masahiko Sawada
 
PDF
Parallel Vacuum
Masahiko Sawada
 
PDF
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
Masahiko Sawada
 
PDF
PostgreSQL10徹底解説
Masahiko Sawada
 
PDF
FDW-based Sharding Update and Future
Masahiko Sawada
 
PDF
What’s new in 9.6, by PostgreSQL contributor
Masahiko Sawada
 
PDF
PostgreSQL 9.6 新機能紹介
Masahiko Sawada
 
PDF
pg_bigmと類似度検索
Masahiko Sawada
 
PDF
pg_bigmを触り始めた人に伝えたいこと
Masahiko Sawada
 
PDF
Introduction VAUUM, Freezing, XID wraparound
Masahiko Sawada
 
PostgreSQL 15の新機能を徹底解説
Masahiko Sawada
 
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
Transparent Data Encryption in PostgreSQL
Masahiko Sawada
 
PostgreSQL 12の話
Masahiko Sawada
 
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -
Masahiko Sawada
 
Transparent Data Encryption in PostgreSQL and Integration with Key Management...
Masahiko Sawada
 
Bloat and Fragmentation in PostgreSQL
Masahiko Sawada
 
Database Encryption and Key Management for PostgreSQL - Principles and Consid...
Masahiko Sawada
 
今秋リリース予定のPostgreSQL11を徹底解説
Masahiko Sawada
 
Vacuum more efficient than ever
Masahiko Sawada
 
Vacuumとzheap
Masahiko Sawada
 
Parallel Vacuum
Masahiko Sawada
 
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
Masahiko Sawada
 
PostgreSQL10徹底解説
Masahiko Sawada
 
FDW-based Sharding Update and Future
Masahiko Sawada
 
What’s new in 9.6, by PostgreSQL contributor
Masahiko Sawada
 
PostgreSQL 9.6 新機能紹介
Masahiko Sawada
 
pg_bigmと類似度検索
Masahiko Sawada
 
pg_bigmを触り始めた人に伝えたいこと
Masahiko Sawada
 
Introduction VAUUM, Freezing, XID wraparound
Masahiko Sawada
 
Ad

行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 after 1000.269 ms」のログについて