INSERT、UPDATE または DELETE などで更新したテーブルはコミットするまで、テーブルロックが発生します。ロック中に対象テーブルへ更新処理が実行された場合、300秒間は待機しますが、それでもロックが解放されない場合には、タイムアウトエラーを返します。以下は UPDATE と DELETE をそれぞれ別セッションで実行し、ロック情報を確認した実行例です。現在、発生しているロック情報を確認する場合は V_MONITOR スキーマ内の LOCKS システムテーブルを利用します。
LOCKS の実行例
1) セッションAで、UPDATE を実行します。
1 |
dbadmin=> UPDATE lineorder SET lo_tax = 99 WHERE lo_orderkey = 1; |
2) ロック情報を確認します。セッションAの UPDATE が「lock_mode=X」で取得されています。
1 2 3 4 5 6 7 8 9 10 11 |
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 を実行します。
1 |
dbadmin=> DELETE FROM lineorder WHERE lo_orderkey = 1000; |
4) ロック情報を確認します。セッションBの DELETE が「lock_mode=X」で取得されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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でタイムアウトエラーが発生します。
1 |
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 は、必要に応じて変更が可能です。
1 2 3 4 5 6 7 8 |
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 | パラメータの説明 |