すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ApsaraDB RDS for SQL Serverインスタンスでリクエストがブロックされた場合はどうすればよいですか。

最終更新日:Dec 12, 2024
重要

このトピックでは、緊急時にApsaraDB RDS for SQL Serverインスタンスでリクエストがブロックされる問題を解決する方法について説明します。 この問題を解決するために、ブロックの原因を特定して分析し、分析結果に基づいてソリューションを作成することをお勧めします。 ほとんどの場合、問題はインデックスの欠落または大規模なトランザクションが原因です。 インデックスが欠落している場合やトランザクションが大きい場合は、トランザクションが長時間実行され、ロックホールドが延長されます。 その結果、多数のリクエストがブロックされます。 詳細については、「ApsaraDB RDS for SQL Serverインスタンスでリクエストがブロックされる問題を解決するにはどうすればよいですか。」をご参照ください。

問題の説明

RDSインスタンスでリクエストがブロックされます。

原因

トランザクションはロックされたリソースを求めて競合します。

解決策

  1. 次のステートメントを実行して、ロックとブロックに関する情報を取得します。

    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
  2. 次のステートメントを実行して、ロックされたリソースに関する情報を取得します。

    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] は、トランザクションが待機するリソースを指定します。

  3. killコマンドを実行して、ブロッキングセッションを終了します。