در SQL Server، وقوع Deadlock زمانی است که دو یا چند تراکنش در تلاش برای دسترسی به منابع مشترک به گونهای باشند که هر یک منتظر دیگری بماند.
در نتیجه این انتظار بدون پایان باشد.
این حالت میتواند کارایی سیستم را به شدت تحت تأثیر قرار دهد.
در این مقاله، دو راهکار هوشمندانه برای جلوگیری از Deadlock را بررسی میکنیم.
یکی از مهمترین راهکارهای جلوگیری از Deadlock این است که در تمام تراکنشها ترتیب دسترسی به منابع یکسان باشد.
یعنی اگر دو تراکنش به منابع مشابه نیاز دارند، باید از همان ترتیب یکسان برای دسترسی به آن منابع استفاده کنند.
با این کار، احتمال وقوع بنبست کاهش مییابد.
-- مثال 1: ترتیب دسترسی یکسان در دو تراکنش BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 1 WHERE ID = 1; UPDATE TableB SET ColumnB = 2 WHERE ID = 1; COMMIT; BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 3 WHERE ID = 2; UPDATE TableB SET ColumnB = 4 WHERE ID = 2; COMMIT;
در این مثال، دو تراکنش از همان ترتیب برای دسترسی به منابع (جدولها) استفاده میکنند.
به این ترتیب، Deadlock از بین میرود.
-- مثال 2: تراکنشهایی با دسترسی به منابع مختلف در ترتیب یکسان BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 5 WHERE ID = 3; UPDATE TableB SET ColumnB = 6 WHERE ID = 3; COMMIT; BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 7 WHERE ID = 4; UPDATE TableB SET ColumnB = 8 WHERE ID = 4; COMMIT;
این روش در صورتی که به درستی پیادهسازی شود، میتواند خطر وقوع Deadlock را به طور چشمگیری کاهش دهد.
استفاده از Transaction Timeout به این معناست که اگر یک تراکنش برای مدت زمان مشخصی منتظر بماند و نتواند به منبع دسترسی پیدا کند، به طور خودکار متوقف شود.
با این کار، از طولانی شدن تراکنشها و افزایش احتمال Deadlock جلوگیری میشود.
-- مثال 3: استفاده از SET LOCK_TIMEOUT برای محدود کردن مدت زمان قفل SET LOCK_TIMEOUT 10000; -- 10 ثانیه BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 9 WHERE ID = 5; UPDATE TableB SET ColumnB = 10 WHERE ID = 5; COMMIT;
در این مثال، SET LOCK_TIMEOUT تعیین میکند که اگر تراکنش برای بیشتر از 10 ثانیه نتواند به منابع دسترسی پیدا کند، متوقف شود.
-- مثال 4: محدود کردن زمان قفلگذاری در تراکنشهای پیچیده SET LOCK_TIMEOUT 5000; -- 5 ثانیه BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 11 WHERE ID = 6; UPDATE TableB SET ColumnB = 12 WHERE ID = 6; COMMIT;
این کار به جلوگیری از تراکنشهای طولانی و پیچیده کمک میکند و خطر Deadlock را کاهش میدهد.
ترکیب راهکارهایی مانند ترتیب یکسان در دسترسی به منابع و استفاده از Transaction Timeout میتواند یک استراتژی موثر برای جلوگیری از Deadlock باشد.
اگر تمامی تراکنشها به روشی سازماندهی شده و قابل پیشبینی عمل کنند، وقوع Deadlock بسیار کمتر خواهد بود.
-- مثال 5: ترکیب ترتیب دسترسی و محدودیت زمان قفلگذاری SET LOCK_TIMEOUT 10000; -- 10 ثانیه BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 13 WHERE ID = 7; UPDATE TableB SET ColumnB = 14 WHERE ID = 7; COMMIT; SET LOCK_TIMEOUT 10000; -- 10 ثانیه BEGIN TRANSACTION; UPDATE TableA SET ColumnA = 15 WHERE ID = 8; UPDATE TableB SET ColumnB = 16 WHERE ID = 8; COMMIT;
در این مثال، علاوه بر ترتیب دسترسی یکسان، محدودیت زمانی نیز اعمال شده است که به پیشگیری از Deadlock کمک میکند.
اگر به SQL SERVER علاقه دارید دانش خود را در SQLLEARN افزایش دهید.