重要
このトピックでは、緊急時にApsaraDB RDS for SQL Serverインスタンスでリクエストがブロックされる問題を解決する方法について説明します。 この問題を解決するために、ブロックの原因を特定して分析し、分析結果に基づいてソリューションを作成することをお勧めします。 ほとんどの場合、問題はインデックスの欠落または大規模なトランザクションが原因です。 インデックスが欠落している場合やトランザクションが大きい場合は、トランザクションが長時間実行され、ロックホールドが延長されます。 その結果、多数のリクエストがブロックされます。 詳細については、「ApsaraDB RDS for SQL Serverインスタンスでリクエストがブロックされる問題を解決するにはどうすればよいですか。」をご参照ください。
問題の説明
RDSインスタンスでリクエストがブロックされます。
原因
トランザクションはロックされたリソースを求めて競合します。
解決策
次のステートメントを実行して、ロックとブロックに関する情報を取得します。
SELECT dtl.request_session_id AS waitSID, der.blocking_session_id AS blockSID, dowt.resource_description, der.wait_type, dowt.wait_duration_ms, DB_NAME(dtl.resource_database_id) AS DB, dtl.resource_associated_entity_id AS waitingAssociatedEntity, dtl.resource_type AS waitResType, dtl.request_type AS waitReqType, dest.[text] AS waitSQL, dtl1.request_type AS blockReqType, dest1.[text] AS blockingSQL FROM sys.dm_tran_locks dtl JOIN sys.dm_os_waiting_tasks dowt ON dowt.resource_address=dtl.lock_owner_address JOIN sys.dm_exec_requests der ON der.session_id=dtl.request_session_id CROSS apply sys.dm_exec_sql_text(der.sql_handle) dest LEFT JOIN sys.dm_exec_requests der1 ON der.session_id=dowt.blocking_session_id OUTER apply sys.dm_exec_sql_text(der1.sql_handle) dest1 LEFT JOIN sys.dm_tran_locks dtl1 ON dtl1.request_session_id=der1.session_id
次のステートメントを実行して、ロックされたリソースに関する情報を取得します。
SELECT OBJECT_NAME(i.object_id) obj, i.name FROM sys.partitions p JOIN sys.indexes i ON i.object_id=p.object_id AND i.index_id=p.index_id WHERE p.partition_id=[$Waiting_Associate_Entity]
説明[$Waiting_Associate_Entity]
は、トランザクションが待機するリソースを指定します。kill
コマンドを実行して、ブロッキングセッションを終了します。