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 | ロックモード |
LOCK_SCOPE | ロック許可前に要求されたスコープのリスト |
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_timestamp5) 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 COMMITTED6) 現在、設定されている 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で確認しています。