8 cách khác nhau để phát DeadLock trong truy vấn cơ sở dữ liệu SQL Server

DeadLock là hiện tượng tranh chấp tài nguyên giữa hai hay nhiều lệnh trong đó lệnh này giữ tài nguyên mà lệnh kia cần dẫn tới việc không lệnh nào có thể kết thúc để giải phóng tài nguyên.
Ví dụ:

  • Giao dịch T1 giữ được tài nguyên R1, nhưng cần tài nguyên R2 để kết thúc và giải phóng R1
  • R2 lại đang bị T2 giữ và T2 cần R1 để kết thúc và sau đó giải phóng R2.
  • Trong trường hợp này cả T1 và T2 không thể kết thúc. Trường hợp này trong SQL Server sẽ phải chọn kill một trong hai giao dịch.

Xem thêm bài https://timoday.edu.vn/phan-tich-deadlock-trong-co-so-du-lieu-va-cach-phong-tranh/
Trong bài này chúng tôi giới thiệu các cách khác nhau để tìm ra các lỗi DeadLock trong truy vấn cơ sở dữ liệu của SQL Server

1. Sử dụng câu lệnh T-SQL SP_LOCK

Thực thi câu lệnh T-SQL SP_LOCK của SQL Server, bạn có thể tìm các status là WAIT cho các phiên đang bị chặn.


USE master;  
GO  
EXEC sp_lock;  
GO 


Tìm Deadlock với SP_LOCK
Xem thêm tại đây

2. Sử dụng câu lệnh truy vấn với sys.sysprocesses


SELECT * FROM sys.sysprocesses 
WHERE blocked > 0


3. Sử dụng trình DVM (Dynamic Management Views)


SELECT 	
	der.blocking_session_id AS BlockingSessionID
	,dest.text AS BlockingStatement
FROM sys.dm_exec_connections AS sdec
INNER JOIN sys.dm_exec_requests AS der
    ON sdec.session_id = der.blocking_session_id
INNER JOIN sys.dm_os_waiting_tasks AS dowt
    ON der.session_id = dowt.session_id
CROSS APPLY sys.dm_exec_sql_text(sdec.most_recent_sql_handle) AS dest


4. Sử dụng sys.dm_tran_locks


SELECT 
	request_session_id AS SPID 
	,DB_NAME(resource_database_id) AS DatabaseName
	,resource_type AS LockedResource
	,request_mode AS LockType
FROM sys.dm_tran_locks


5. Bật cờ theo dõi bắt buộc để ghi thông tin liên quan đến DeadLock trong Tracefile


DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1)


6. Đếm tổng số lần xảy ra DeadLock


SELECT cntr_value AS TotalNumberOfDeadLocks
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Number of Deadlocks/sec'
   AND instance_name = '_Total'


7. Sử dụng Extended Events và đoạn script bên dưới để tạo một Extended Event cho theo dõi DeadLock


CREATE EVENT SESSION [Deadlock_Monitor] ON SERVER 
ADD EVENT sqlos.scheduler_monitor_deadlock_ring_buffer_recorded,
ADD EVENT sqlserver.lock_deadlock,
ADD EVENT sqlserver.lock_deadlock_chain,
ADD EVENT sqlserver.xml_deadlock_report 
ADD TARGET package0.event_file(SET filename=N'C:\Temp\Deadlock_Monitor.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)
GO


Bạn có thể sử dụng SSMS để tạo Extended Events cho DeadLock, và có thể theo dõi trạng thái trực tiếp của server.
Xem DeadLock trong Extended Events
Xem kết quả khi xảy ra DeadLock:
Kết quả DeadLock được ghi nhận

8. Sử dụng SQL Server Profiler

SQL Server Profiler có ba kiểu sự kiện khác nhau để bắt DeadLock:

  • Deadlock graph
  • Lock: Deadlock
  • Lock: Deadlock Chain
    Bước 1: Chọn Template là Blank
    Chọn kiểu Blank cho SQL Profiter
    Bước 2: Chọn kiểu Events là Locks để bắt các sự kiện liên quan đến DeadLock
    Chọn Sự kiện Locks để bắt deadlock

Có thể bạn sẽ thích…

Để lại một bình luận