مدیریت همزمانی با تراکنش و قفل
تراکنش در SQL Server نیز مانند سایر پایگاههای داده تضمین میکند مجموعهای از عملیات یا همگی اجرا شوند یا هیچکدام. برای تعریف صریح یک تراکنش:
BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 500000 WHERE Id = 1;
UPDATE Accounts SET Balance = Balance + 500000 WHERE Id = 2;
IF @@ERROR = 0
COMMIT TRANSACTION;
ELSE
ROLLBACK TRANSACTION;
هنگام اجرای تراکنشها، SQL Server برای جلوگیری از تداخل داده بین کاربران همزمان، بهطور خودکار روی ردیفها یا جدولهای درگیر قفل (Lock) میگذارد. قفلهای رایج شامل Shared Lock (برای خواندن) و Exclusive Lock (برای نوشتن) هستند. اگر دو تراکنش همزمان منتظر آزاد شدن منابعی باشند که یکدیگر قفل کردهاند، وضعیتی به نام Deadlock رخ میدهد که SQL Server بهطور خودکار یکی از دو تراکنش را بهعنوان قربانی (victim) لغو میکند.
برای مشاهدهی قفلهای فعال فعلی میتوان از View سیستمی زیر استفاده کرد:
SELECT * FROM sys.dm_tran_locks;
سطح ایزولاسیون پیشفرض SQL Server، READ COMMITTED است که از خواندن دادهی commitنشده جلوگیری میکند اما ممکن است باعث انتظار طولانیتر شود؛ سطح READ COMMITTED SNAPSHOT با استفاده از نسخهسازی ردیف (row versioning) میتواند بسیاری از این انتظارها را بدون قربانی کردن صحت داده کاهش دهد و در بسیاری از پروژههای واقعی فعال میشود.