はじめに
Verticaでのロックについて、ご紹介致します。ここでいうロックとは、トランザクションによって発生するロックです。
Verticaのロック・モード
Verticaには全部で7種類のロック・モードがあります。各ロック・モードとその意味について、以下の表をご参照ください。
番号 | ロック・モード | 意味 |
---|---|---|
1 | S | Select実行時に適用されるShareロック |
2 | I | Insert実行時に適用されるInsertロック |
3 | SI | テーブルを読み込みクエリを実行する際に適用されるShare+Insertロック |
4 | X | Delete実行時に適用されるExclusiveロック |
5 | T | Tuple MoverおよびプレジョインプロジェクションへのCOPY実行時に適用されるTuple Moverロック |
6 | U | moveoutとmergeoutの最初のフェーズで適用されるUsageロック |
7 | O | DROP_PARTITION/TRUNCATE TABLE/ADD COLUMN実行時に適用されるOwnerロック |
8 | IV | Primary key及びUnique key制約が有効なテーブルに対するInsert時に取得されるロック |
Verticaのロック・モードの相関関係
複数のトランザクションが処理する間、各トランザクションが持つロック・モードの相関関係を以下のマトリックスに記載します。(このマトリックスは、トランザクションの順序に関係なくシンメトリックな関係性になっています)
取得済のモード (先のトランザクション) |
|||||||||
---|---|---|---|---|---|---|---|---|---|
S | I | IV | SI | X | T | U | O | ||
要求された処理のモード (後のトランザクション) | S | Yes | No | No | No | No | Yes | Yes | No |
I | No | Yes | Yes | No | No | Yes | Yes | No | |
IV | No | Yes | No | No | No | Yes | Yes | No | |
SI | No | No | No | No | No | Yes | Yes | No | |
X | No | No | No | No | No | No | Yes | No | |
T | Yes | Yes | Yes | Yes | No | Yes | Yes | No | |
U | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | |
O | No | No | No | No | No | No | No | No |
マトリックスの見方
(例1)
先に処理していたトランザクションAがSロックを持っていたら、後からの処理であるトランザクションBはIロックを取得する事ができません。
(例2)
先に処理していたトランザクションAがIロックを持っていたら、後からの処理であるトランザクションBはIロックを取得する事ができます。
先に処理していたトランザクションAがSロックを持っていたら、後からの処理であるトランザクションBはIロックを取得する事ができません。
(例2)
先に処理していたトランザクションAがIロックを持っていたら、後からの処理であるトランザクションBはIロックを取得する事ができます。
ロック・モードの確認方法
ロック・モードを確認するには、locksテーブルを参照します。
1 |
SELECT * FROM locks ; |
(例)
あるトランザクションがINSERT処理を行い、COMMITをしていない状態があります。
その状態のロック・モードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
dbadmin=> SELECT * FROM locks; -[ RECORD 1 ]-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- node_names | v_testdb_node0001 object_name | Table:public.t1 object_id | 45035996274236974 transaction_id | 45035996274410200 transaction_description | Txn: a00000000ac2d8 'SELECT quote_ident(table_schema), quote_ident(table_name), case when is_temp_table then 'temporary' else 'table' end, v_catalog.tables.owner_name, comment FROM v_catalog.tables LEFT JOIN v_catalog.comments on object_id = table_id ORDER BY 1,2;' lock_mode | I lock_scope | TRANSACTION request_timestamp | 2018-12-25 13:13:48.092331+09 grant_timestamp | 2018-12-25 13:13:48.092341+09 |
9行目のlock_modeの値が「I」になっている事から、このトランザクションがInsertロックを取得している事がわかります。
つぎに、そのトランザクションがCOMMITをした後のロック・モードを見てみましょう。
1 2 |
dbadmin=> SELECT * FROM locks; (No rows) |
そのトランザクションがCOMMITをした事で、Insertロックが解放された事がわかります。