در هر سامانه دادهای، بهویژه در محیطهای پرتراکنش، مدیریت همزمانی (Concurrency Control) یکی از حیاتیترین چالشهاست. SQL Server برای حفظ یکپارچگی دادهها (Data Integrity) و اجرای اصل ACID، از مکانیزمی به نام Locking استفاده میکند. اما همین قفلها، اگر درست مدیریت نشوند، میتوانند خود به عامل کندی، توقف یا بنبست (Deadlock) تبدیل شوند.
در این مقاله از لاندا، نگاهی جامع و بهروز (مطابق نسخههای ۲۰۲۲ تا ۲۰۲۵ SQL Server) به نحوهی کار Lockها، تفاوت آنها با Latch، علت وقوع Deadlock، روشهای تشخیص، ابزارهای مانیتورینگ و راهکارهای عملی پیشگیری خواهیم داشت.
Lock در SQL Server چیست؟
Lock یا قفل، سازوکاری است که SQL Server از آن برای کنترل دسترسی همزمان به منابع استفاده میکند. این منابع میتوانند رکورد، صفحه (Page)، جدول، یا حتی کل دیتابیس باشند. هدف از Lock این است که چند تراکنش بهطور همزمان دادهای را تغییر ندهند و باعث ناسازگاری نشوند.
انواع Lock
- Shared (S): اجازهی خواندن میدهد ولی مانع نوشتن میشود.
- Exclusive (X): فقط برای نوشتن استفاده میشود؛ هیچ تراکنش دیگری حق دسترسی ندارد.
- Update (U): بین حالت Shared و Exclusive؛ برای جلوگیری از Deadlock در عملیات UPDATE.
- Intent Locks (IS, IX, SIX): اعلام میکند که در سطوح پایینتر Lock گرفته خواهد شد.
- Schema Locks (Sch-S, Sch-M): برای جلوگیری از تغییر ساختار هنگام Query یا Migration.
- Bulk Update (BU): مخصوص عملیات BULK INSERT یا Importهای حجیم.
نحوه کار Lock Manager
موتور Lock Manager در SQL Server مسئول تخصیص و آزادسازی قفلهاست. هر تراکنش هنگام اجرا، از طریق Transaction ID و Resource ID با Lock Manager هماهنگ میشود.
اگر دو تراکنش روی یک منبع درگیر شوند، یکی از آنها باید صبر کند تا دیگری Lock خود را آزاد کند. این حالت، Blocking نام دارد که هنوز بنبست نیست، ولی هشدار است.
Deadlock چیست و چگونه رخ میدهد؟
Deadlock زمانی رخ میدهد که دو (یا چند) تراکنش در انتظار آزاد شدن Lock از یکدیگر باشند و هیچکدام قادر به ادامه نباشند.
SQL Server پس از شناسایی بنبست، یکی از تراکنشها را Victim اعلام کرده و آن را Rollback میکند تا دیگری ادامه دهد.
مثال ساده از Deadlock
-- Session 1
BEGIN TRAN
UPDATE Orders SET Status = 'Pending' WHERE OrderID = 1
-- Session 1 هنوز Commit نکرده و Lock روی Orders دارد
UPDATE Customers SET Name = 'Ali' WHERE CustomerID = 1
-- اینجا منتظر Session 2 میماند
-- Session 2
BEGIN TRAN
UPDATE Customers SET Name = 'Reza' WHERE CustomerID = 1
-- Session 2 هم Lock روی Customers دارد
UPDATE Orders SET Status = 'Done' WHERE OrderID = 1
-- حالا هر دو Session در انتظار یکدیگرند → Deadlock
نحوهی تشخیص Deadlock
۱. SQL Server Error Log
وقوع Deadlock معمولاً با خطای معروف Msg 1205, Level 13, State 51 مشخص میشود:
“Transaction (Process ID xx) was deadlocked on resources with another process and has been chosen as the deadlock victim.”
۲. Extended Events / Profiler
میتوان از System_Health Session یا Extended Event: xml_deadlock_report برای مشاهده جزئیات گراف بنبست استفاده کرد.
نمونه دستور:
SELECT XEvent.query('(event/data/value/deadlock)[1]') AS DeadlockGraph
FROM sys.fn_xe_file_target_read_file(
'*.xel', NULL, NULL, NULL);
۳. DMVها
SELECT * FROM sys.dm_tran_locks;
SELECT * FROM sys.dm_os_waiting_tasks WHERE wait_type LIKE '%LCK%';
۴. مانیتورینگ با ابزارهای لاندا
در سرویس مانیتورینگ لاندا، Deadlockها بهصورت Real-Time شناسایی و گراف بصری آنها در داشبورد نمایش داده میشود. این سیستم با تحلیل رفتار قفلها، نقاط پرریسک را قبل از وقوع بنبست هشدار میدهد.
تفاوت Lock، Latch و Spinlock
- Lock: کنترل منطقی همزمانی در سطح دادهها.
- Latch: قفل سبکوزن برای ساختارهای حافظهای (مثل Page Buffer).
- Spinlock: قفل بسیار سریع برای ساختارهای داخلی CPU-bound، معمولاً در سطح Thread Synchronization.
راهکارهای پیشگیری از Deadlock
۱. ترتیب یکسان در دسترسی به منابع
همیشه در برنامهنویسی SQL ترتیب دسترسی به جداول را ثابت نگه دارید تا تراکنشها وارد چرخهی انتظار نشوند.
۲. کوتاه نگه داشتن تراکنشها
هرچه تراکنش طولانیتر باشد، احتمال Deadlock بیشتر است. از Commit سریع استفاده کنید.
۳. استفاده از Isolation Level مناسب
Isolation Levelهای READ COMMITTED SNAPSHOT یا SNAPSHOT میتوانند از طریق نسخهبرداری از دادهها (Version Store در TempDB) قفلهای غیرضروری را حذف کنند.
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON;
۴. بهینهسازی ایندکسها
جداول بدون ایندکس منجر به Table Scan میشوند که قفل سطح بالاتری نیاز دارند و احتمال Deadlock را افزایش میدهند.
۵. استفاده از Query Hintها
در شرایط خاص، میتوان از HINTهایی مانند WITH (NOLOCK) (فقط برای SELECT) یا ROWLOCK، UPDLOCK استفاده کرد — البته با آگاهی از عوارضشان.
۶. مانیتورینگ مداوم
ابزارهایی مانند SQL Monitor، SentryOne یا روشهای مانیتورینگ لاندا، میتوانند نرخ وقوع Deadlock را رصد و تحلیل کنند.
رفع Deadlock بهصورت دستی و خودکار
دستی:
- اجرای دستور
DBCC TRACEON (1222, -1)برای ثبت گراف Deadlock - تحلیل XML گراف و شناسایی Queryهای درگیر
- بازنویسی Query یا تغییر ترتیب دسترسی
خودکار
از TRY…CATCH در T-SQL استفاده کنید تا در صورت Deadlock، Query مجدداً اجرا شود:
BEGIN TRY
-- تراکنش اصلی
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 1205
WAITFOR DELAY '00:00:01';
-- Retry logic
END CATCH
مانیتورینگ Lock و Deadlock در سال ۲۰۲۵
در نسخههای جدید SQL Server 2022 و Windows Server 2025، با پشتیبانی از Azure Arc و Intelligent Query Processing v3، SQL Engine میتواند الگوهای Deadlock را یاد بگیرد و Query Plan را بهصورت خودکار اصلاح کند.
لاندا نیز در سرویسهای DBA خود از تحلیل رفتار قفلها با Machine Learning Telemetry استفاده میکند تا قبل از وقوع بنبست، هشدار دقیق صادر کند.
نتیجهگیری
Lock بخش ضروری از حیات SQL Server است، اما اگر کنترل نشود، میتواند به Deadlock و افت شدید کارایی منجر شود. شناخت نوع قفلها، بررسی گرافهای Deadlock، و طراحی صحیح تراکنشها کلید حفظ پایداری سیستمهای دادهای است.
در محیطهای Enterprise، ترکیب تجربهی DBAهای خبره با سیستمهای مانیتورینگ پیشگیرانه مانند خدمات لاندا، مطمئنترین راه برای پیشگیری از این بحران خاموش است.
سوالات متداول (FAQ)
۱. آیا هر Lock خطرناک است؟
خیر، Lock برای حفظ یکپارچگی داده ضروری است. تنها زمانی مشکلساز میشود که به Blocking یا Deadlock منجر شود.
۲. تفاوت Blocking و Deadlock چیست؟
در Blocking، یک Session منتظر آزاد شدن منبع است. در Deadlock، دو Session منتظر یکدیگر هستند و هیچکدام ادامه نمیدهند.
۳. آیا NOLOCK مشکل را حل میکند؟
در ظاهر سرعت را بالا میبرد، ولی میتواند باعث خواندن دادههای ناپایدار (Dirty Read) شود؛ استفاده از آن باید هدفمند باشد.
۴. چگونه بفهمیم Deadlock زیاد رخ میدهد؟
با بررسی DMVها یا گزارشهای System_Health Session میتوان نرخ Deadlock را در طول زمان مشاهده کرد.
۵. آیا SQL Server خودش Deadlock را رفع میکند؟
بله، یکی از تراکنشها را بهعنوان Victim انتخاب کرده و Rollback میکند تا دیگری ادامه یابد.
پیشنهاد مطالعه: تحلیل Wait-Stats در SQL Server
خدمات مانیتورینگ و DBA لاندا
اگر سیستم شما با کندی، بنبست یا خطاهای تراکنش مواجه است، تیم DBA لاندا میتواند با مانیتورینگ ۲۴/۷، تحلیل قفلها و بهینهسازی Query Plan، کارایی و پایداری سرور SQL شما را تضمین کند.
برای دریافت مشاوره تخصصی یا فعالسازی مانیتورینگ هوشمند، با تماس ✆ بگیرید.

و سپس «افزودن به صفحه اصلی» ضربه بزنید
و سپس «افزودن به صفحه اصلی» ضربه بزنید

نظری داده نشده