All Products
Search
Document Center

ApsaraDB RDS:Menangani masalah blocking di RDS for SQL Server

Last Updated:Jun 21, 2026

Deskripsi masalah

Terjadi blocking pada instans ApsaraDB RDS for SQL Server.

Penyebab

Blocking terjadi ketika aplikasi sering membaca dari atau menulis ke tabel atau resource tertentu. Blocking yang parah memperlambat eksekusi statement di aplikasi Anda.

Pemecahan Masalah

Untuk memecahkan masalah blocking pada instans ApsaraDB RDS for SQL Server, ikuti langkah-langkah berikut.

  1. Monitor secara terus-menerus SYS.SYSPROCESSES untuk mengumpulkan informasi blocking. Jalankan perintah berikut:

    WHILE 1 = 1
    BEGIN
        SELECT * FROM SYS.SYSPROCESSES WHERE BLOCKED <> 0;
        WAITFOR DELAY '00:00:01';
    END;
    Catatan

    Anda dapat menyesuaikan interval polling. Contoh ini menggunakan 00:00:01.

    Hasil kueri menunjukkan bahwa spid=56 diblokir oleh spid=53 (blocked=53), sedang menunggu kunci tipe LCK_M_S, dengan sumber daya tunggunya berupa KEY: 5:72057594038845440 (98ec012aa510). Selama beberapa siklus kueri, nilai waittime meningkat secara berurutan (9.205, 10.206, 11.207, 12.208, dan 13.209), yang mengindikasikan bahwa kunci tersebut belum dirilis.

    Catatan

    Kolom blocked menampilkan session_id dari session yang menyebabkan blocking, sedangkan kolom waitresource mengidentifikasi resource yang sedang ditunggu oleh session yang diblokir. Untuk informasi lebih lanjut tentang field yang dikembalikan, lihat dokumentasi resmi sys.sysprocesses.

  2. Monitor secara terus-menerus view seperti sys.dm_tran_locks dan sys.dm_os_waiting_tasks untuk mengidentifikasi rantai blocking lengkap. Jalankan perintah berikut:

    WHILE 1 = 1
    Begin
    SELECT db.name DBName,
           tl.request_session_id,
    wt.blocking_session_id,
    OBJECT_NAME(p.OBJECT_ID) BlockedObjectName,
                                        tl.resource_type,
                                        h1.TEXT AS RequestingText,
                                        h2.TEXT AS BlockingText,
                                        tl.request_mode
    FROM sys.dm_tran_locks AS tl
    INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id
    INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address
    INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id
    INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id
    INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id
    CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1
    CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2
    WAITFOR DELAY '00:00:01';
    END;

    Contoh hasil kueri: Di database jacky, session dengan request_session_id 62 diblokir oleh session dengan blocking_session_id 56. Objek yang diblokir adalah Tbl1, tipe resource-nya adalah KEY, statement yang diminta (RequestingText) adalah (@1 int,@2 int)INSERT INTO [dbo].[Tbl2]([id],[c..., statement yang menyebabkan blocking (BlockingText) adalah BEGIN TRAN INSERT into dbo.Tbl1 (id, col) VALUE..., dan mode lock yang diminta adalah S.

    Tabel berikut menjelaskan parameter yang dikembalikan:

    Parameter

    Deskripsi

    DBName

    Nama database.

    request_session_id

    ID session yang diblokir (requesting).

    blocking_session_id

    ID sesi pemblokiran.

    BlockedObjectName

    Objek yang coba diakses oleh session yang diblokir.

    resource_type

    Jenis resource yang sedang ditunggu.

    RequestingText

    Statement yang dieksekusi oleh session yang diblokir (requesting).

    BlockingText

    Statement yang sedang dieksekusi oleh session yang menyebabkan blocking.

    request_mode

    Mode lock yang diminta oleh session requesting.

Rekomendasi Penyetelan

Ikuti rekomendasi berikut untuk meningkatkan performa.

  1. Untuk segera menyelesaikan blocking, tutup koneksi session yang menyebabkan blocking.

  2. Identifikasi dan segera commit transaksi jangka panjang yang belum dikomit.

  3. Jika blocking disebabkan oleh shared (S) lock dan aplikasi Anda dapat menerima dirty read, gunakan petunjuk kueri WITH (NOLOCK). Sebagai contoh, Anda dapat menulis SELECT * FROM table WITH (NOLOCK); untuk mencegah kueri meminta lock, sehingga menghindari blocking.

  4. Tinjau logika aplikasi Anda untuk memastikan resource diakses dalam urutan yang konsisten.

Operasi Terkait