آموزش Transaction
بسم الله الرحمن الرحیم
آموزش Transaction
مورد فایل LDF قبلا توضیحاتی ارائه گردید همان طور که قبلا ذکر کردیم نام این فایل Transaction DataBase File می باشد و وظیفه آن ذخیره دستورات برای اجرای کامل آنها در صورت ایجاد مشکل می باشد.
برای استفاده هوشمندانه از این ویژگی می بایست به صورت زیر عمل کنیم:
BEGIN TRAN T1
SELECT * FROM Account
COMMIT TRAN T1
BEGIN TRAN T1
این دستور باعث می شود خطوط بعدی در رم ذخیره شود.
COMMIT TRAN T1
باعث می شود کل دستورات در فایل ذخیره می شود.
برای مدیریت خطاهایی که رخ می دهد می بایست از ساختار Try-Catch استفاده کنیم. در این صورت اگر خطایی رخ دهد دیگر دستورات ادامه پیدا نمی کند و به صورت مدیریت شده دستورات متوقف می شود. برای درک بهتر این مسئله را در نظر بگیرید، فکر کنید می خواهید اطلاعات کاربری را پیدا کنید که دارای نام کاربری مشخص است اگر این کاربر در سیستم وجود نداشته باشد خطایی رخ نمی دهد و دستورات به صورت کامل اجرا می شوند حال اگر دستور بعد از بازیابی اطلاعات کاربر دستور مربوط به واریز مبالغی به حساب وی باشد این فرایند بدون هیچ مشکلی خاصی اجرا می شود ولی مبالغ انتقال داده نمی شود این باعث می شود که شما در نظر بگیرید که کار را به خوبی انجام داده اید برای حل این مشلات بهتر است فرایند ها را با RollBack مدیریت کنید. حال اگر خطای منطقی رخ دهد بهتر است برای مدیریت آن از دستور Try-Catch استفاده نماییم.
ROLLBACK کل دستورات درون تراکنش را لغو می کند.
مثال:
BEGIN TRY
BEGIN TRAN T1
IF(((SELECT COUNT(*) FROM Account) != 2))
RAISERROR('خطا',16,1)
COMMIT TRAN T1
END TRY
BEGIN CATCH
PRINT @@ERROR --شماره خطا
PRINT ERROR_NUMBER()--شماره خطا
PRINT ERROR_MESSAGE() -- پیغام خطا
ROLLBACK TRAN T1
END CATCH
ممکن است گاهی بخواهید تراکنش های تو در تو ایجاد کنید، حال حالتی را در این تراکنش در نظر بگیرید که تراکنش داخلی تر نخواهید به هر دلیل اجرا شود، برای مدیریت این روش باید یک Save Point تعریف نماییم تا زمانی که پدر Commit می شود فرزند Rollback می شود، در واقع فرزند از بین می رود.
نکته: با استفاده از Save Point ها فقط می توانیم یک تیکه را Rollback کنیم.
نکته: دستوراتی مانند Select یا انتساب متغییر ها حتی اگر RollBack هم شوند اجرا می شود چون این دستورات از Ram می خوانند و RollBack فقط باعث می شود که دستورات در دیسک ذخیره نشوند.
مثال:
BEGIN TRY
BEGIN TRAN Parent
SELECT COUNT(*) FROM Account
BEGIN TRY
SAVE TRAN SAVEPOINT
SELECT COUNT(*) FROM Account
END TRY
BEGIN CATCH
ROLLBACK TRAN SAVEPOINT
END CATCH
SELECT COUNT(*) FROM Account
COMMIT TRAN Parent
END TRY
BEGIN CATCH
ROLLBACK TRAN Parent
END CATCH