OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

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

公開日:
更新日:
基本操作
#ロック

INSERT、UPDATE または DELETE などで更新したテーブルはコミットするまで、テーブルロックが発生します。ロック中に対象テーブルへ更新処理が実行された場合、300秒間は待機しますが、それでもロックが解放されない場合には、タイムアウトエラーを返します。以下は UPDATE と DELETE をそれぞれ別セッションで実行し、ロック情報を確認した実行例です。現在、発生しているロック情報を確認する場合は V_MONITOR スキーマ内の LOCKS システムテーブルを利用します。

LOCKS の実行例

1) セッションAで、UPDATE を実行します。

dbadmin=> UPDATE lineorder SET lo_tax = 99 WHERE lo_orderkey = 1;

2) ロック情報を確認します。セッションAの UPDATE が「lock_mode=X」で取得されています。

dbadmin=> SELECT * FROM locks;
-[ RECORD 1 ]-----------+-------------------------------------------
node_names              | v_vdb_node0001
object_name             | Table:public.LINEORDER
object_id               | 45035996273709128
transaction_id          | 45035996274040099
transaction_description | Txn: a0000000051d23 'select * from locks;'
lock_mode               | X
lock_scope              | TRANSACTION
request_timestamp       | 2018-06-18 14:45:48.175562+09
grant_timestamp         | 2018-06-18 14:45:48.175565+09

[LOCKS]

列名

内容

NODE_NAMES

ノード名

OBJECT_NAME

ロックされているオブジェクト名

OBJECT_ID

オブジェクトID

TRANSACTION_ID

トランザクションID

TRANSACTION_DESCRIPTION

トランザクションの説明

LOCK_MODE

ロックモード
・S - Select実行時に適用されるShareロック(Isolation Level=‘SERIALIZABLE’)
・I - Insert実行時に適用されるInsertロック
・SI - テーブルを読み込みクエリを実行する際に適用されるShare+Insertロック
・X - Delete実行時に適用されるExclusiveロック
・T - Tuple MoverおよびプレジョインプロジェクションへのCOPY実行時に適用されるTuple Moverロック
・U - moveoutとmergeoutの最初のフェーズで適用されるUsageロック
・O – DROP_PARTITION/TRUNCATE TABLE/ADD COLUMN実行時に適用されるOwnerロック

LOCK_SCOPE

ロック許可前に要求されたスコープのリスト
ロック許可後、次のスコープが可能
・STATEMENT_LOCALPLAN
・STATEMENT_COMPILE
・STATEMENT_EXECUTE
・TRANSACTION_POSTCOMMIT
・TRANSACTION

REQUEST_TIMESTAMP

トランザクションのロック開始時間

GRANT_TIMESTAMP

ロック情報が更新された時間


3) セッションBで、DELETE を実行します。

dbadmin=> DELETE FROM lineorder WHERE lo_orderkey = 1000;

4) ロック情報を確認します。セッションBの DELETE が「lock_mode=X」で取得されています。

dbadmin=> SELECT * FROM locks;
-[ RECORD 1 ]-----------+----------------------------------------------------------------------
node_names              | v_vdb_node0001
object_name             | Table:public.LINEORDER
object_id               | 45035996273709128
transaction_id          | 45035996274040099
transaction_description | Txn: a0000000051d23 'select * from locks;'
lock_mode               | X
lock_scope              | TRANSACTION
request_timestamp       | 2018-06-18 14:45:48.175562+09
grant_timestamp         | 2018-06-18 14:45:48.175565+09
-[ RECORD 2 ]-----------+----------------------------------------------------------------------
node_names              | v_vdb_node0001
object_name             | Table:public.LINEORDER
object_id               | 45035996273709128
transaction_id          | 45035996274040118
transaction_description | Txn: a0000000051d36 'delete from lineorder where lo_orderkey = 1000;'
lock_mode               | X
lock_scope              | REQUESTED
request_timestamp       | 2018-06-18 14:47:22.335943+09
grant_timestamp

5) 300秒を超えると、セッションBでタイムアウトエラーが発生します。

ERROR 5156:  Unavailable: initiator locks for query - Locking failure: Timed out X locking Table:public.LINEORDER. X held by [user dbadmin (select * from locks;)]. Your current transaction isolation level is READ COMMITTED

6) 現在、設定されている LockTimeout の設定値を確認すると「CURRENT_VALUE=300」になっています。LockTimeout は、必要に応じて変更が可能です。

dbadmin=> SELECT parameter_name, current_value, change_requires_restart, description
dbadmin-> FROM configuration_parameters
dbadmin-> WHERE parameter_name = 'LockTimeout';
-[ RECORD 1 ]-----------+---------------------------------------------------------
parameter_name          | LockTimeout
current_value           | 300
change_requires_restart | f
description             | Time to wait for a table lock before giving up (seconds)

[CONFIGURATION_PARAMETERS]

列名

内容

PARAMETER_NAME

パラメータ名

CURRENT_VALUE

現在の設定値

CHANGE_REQUIRES_RESTART

変更する場合に再起動が必要かどうか

DESCRIPTION

パラメータの説明

検証バージョンについて

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


この記事をシェアする