فصل 19 از 24 درس 1 از 1

Transaction و مدیریت خطا

Transaction و مدیریت خطا

بخشی از آموزش جامع SQL Server

محتوای درس Transaction و مدیریت خطا

T-SQL | COMMIT، ROLLBACK، TRY/CATCH و XACT_STATE

Transaction چند Statement مرتبط را به یک واحد Atomic تبدیل می‌کند. مدیریت خطا باید تضمین کند Transaction نیمه‌تمام باقی نماند و در حالت غیرقابل Commit به‌درستی Rollback شود.

متن این فصل با رویکرد مرجع فنی و قابل استفاده در پروژه واقعی تنظیم شده است؛ مثال‌ها در امتداد مدل StoreDb نوشته شده‌اند و اصطلاحات اصلی SQL Server و T-SQL به‌صورت یکدست به‌کار می‌روند.

1. مفاهیم و قراردادهای اصلی

Transaction چند Statement مرتبط را به یک واحد Atomic تبدیل می‌کند. مدیریت خطا باید تضمین کند Transaction نیمه‌تمام باقی نماند و در حالت غیرقابل Commit به‌درستی Rollback شود.

در طراحی پایگاه داده، Syntax تنها بخشی از مسئله است. نوع داده، Constraint، الگوی دسترسی، Transaction و هزینه اجرای Query باید هم‌زمان با نیاز Domain در نظر گرفته شوند.

مفهومکارکرد
BEGIN TRANSACTIONشروع واحد
COMMITنهایی‌سازی
ROLLBACKبازگشت
SAVEPOINTنقطه میانی
TRY/CATCHمدیریت خطا
XACT_STATEوضعیت Transaction

2. ساختار و Syntax پایه

SET XACT_ABORT ON همراه TRY/CATCH الگوی مناسبی برای بسیاری از Procedureهای عملیاتی است. در CATCH، وضعیت Transaction بررسی و در صورت لازم Rollback انجام می‌شود، سپس THROW خطا را حفظ می‌کند.

SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;

    UPDATE dbo.Products
    SET Stock = Stock - 1
    WHERE Id = 1 AND Stock >= 1;

    COMMIT;
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0
        ROLLBACK;
    THROW;
END CATCH;

3. سناریوی StoreDb

ثبت Order شامل Insert Header، Insert Item و کاهش Stock است. اگر هر مرحله Fail شود، هیچ تغییر نیمه‌کاره نباید باقی بماند.

نمونه‌های این فصل بر مدل فروشگاهی StoreDb بنا شده‌اند تا ارتباط مفاهیم میان فصل‌ها حفظ شود و Queryها در یک Context یکپارچه قابل بررسی باشند.

BEGIN TRANSACTION;

INSERT INTO dbo.Orders(CustomerId, OrderDate, TotalAmount, Status)
VALUES (1, SYSDATETIME(), 2800000, N'Pending');

DECLARE @OrderId bigint = SCOPE_IDENTITY();

INSERT INTO dbo.OrderItems(OrderId, ProductId, Quantity, UnitPrice)
VALUES (@OrderId, 3, 1, 2800000);

COMMIT;

4. اصول طراحی و Performance

طراحی پایدار باید هم صحت داده و هم هزینه اجرای عملیات را پوشش دهد. انتخاب ساده‌تر زمانی ترجیح دارد که Contract داده را روشن‌تر و رفتار Optimizer را قابل پیش‌بینی‌تر نگه دارد.

  • Transaction کوتاه نگه داشته شود.
  • Call شبکه داخل Transaction Database طولانی انجام نشود.
  • Isolation Level بر اساس Concurrency انتخاب شود.
  • Deadlock و Retry در لایه Caller قابل بررسی است.

5. خطاهای رایج و نکات ایمنی

دستورهای SQL می‌توانند مستقیماً داده و ساختار را تغییر دهند؛ بنابراین بازبینی Context، تعداد Rowهای هدف و اثر Transaction قبل از اجرای تغییرات اهمیت عملی دارد.

  • Transaction باز بدون COMMIT/ROLLBACK.
  • TRY/CATCH بدون Rollback.
  • Transaction بسیار طولانی و Blocking.
  • فرض اینکه Nested Transaction مانند Transaction مستقل رفتار می‌کند.

6. چک‌لیست نهایی فصل

  • Atomicity عملیات چندمرحله‌ای برقرار است.
  • CATCH مسیر Rollback دارد.
  • XACT_STATE در خطای جدی در نظر گرفته می‌شود.
  • Transaction Boundary کوتاه و مشخص است.

7. جمع‌بندی

خروجی این فصل باید به تصمیمی قابل اتکا در طراحی یا Query منجر شود؛ صحت داده، قابلیت نگهداری و رفتار Performance سه معیار ثابت برای ارزیابی نمونه‌ها هستند.