はじめに

Verticaでのロックについて、ご紹介致します。
ここでいうロックとは、トランザクションによって発生するロックです。

Verticaのロック・モード

Verticaには全部で7種類のロック・モードがあります。
各ロック・モードとその意味について、以下の表をご参照ください。
番号ロック・モード意味
1SSelect実行時に適用されるShareロック
2IInsert実行時に適用されるInsertロック
3SIテーブルを読み込みクエリを実行する際に適用されるShare+Insertロック
4XDelete実行時に適用されるExclusiveロック
5TTuple MoverおよびプレジョインプロジェクションへのCOPY実行時に適用されるTuple Moverロック
6Umoveoutとmergeoutの最初のフェーズで適用されるUsageロック
7ODROP_PARTITION/TRUNCATE TABLE/ADD COLUMN実行時に適用されるOwnerロック
8IVPrimary key及びUnique key制約が有効なテーブルに対するInsert時に取得されるロック


Verticaのロック・モードの相関関係

複数のトランザクションが処理する間、各トランザクションが持つロック・モードの相関関係を以下のマトリックスに記載します。
(このマトリックスは、トランザクションの順序に関係なくシンメトリックな関係性になっています)
取得済のモード
(先のトランザクション)
SIIVSIXTUO
要求された処理のモード
(後のトランザクション)
SYesNoNoNoNoYesYesNo
INoYesYesNoNoYesYesNo
IVNoYesNoNoNoYesYesNo
SINoNoNoNoNoYesYesNo
XNoNoNoNoNoNoYesNo
TYesYesYesYesNoYesYesNo
UYesYesYesYesYesYesYesNo
ONoNoNoNoNoNoNoNo


マトリックスの見方
(例1)
先に処理していたトランザクションAがSロックを持っていたら、後からの処理であるトランザクションBはIロックを取得する事ができません。
(例2)
先に処理していたトランザクションAがIロックを持っていたら、後からの処理であるトランザクションBはIロックを取得する事ができます。

ロック・モードの確認方法

ロック・モードを確認するには、locksテーブルを参照します。


(例)
あるトランザクションがINSERT処理を行い、COMMITをしていない状態があります。
その状態のロック・モードを見てみましょう。


9行目のlock_modeの値が「I」になっている事から、このトランザクションがInsertロックを取得している事がわかります。
つぎに、そのトランザクションがCOMMITをした後のロック・モードを見てみましょう。


そのトランザクションがCOMMITをした事で、Insertロックが解放された事がわかります。

関連情報

テーブルのロックを確認する方法

検証バージョンについて

この記事の内容はVertica 9.1で確認しています。