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 سه معیار ثابت برای ارزیابی نمونهها هستند.