View Full Version : مدیریت خطاها در Transaction بدون "محکوم به فنا شدن" Transaction
manager
سه شنبه 10 فروردین 1389, 15:06 عصر
سلام به همه
من یه Transaction طولانی دارم که داخلش چندیدن بلوک Try..Catch استفاده کردم. یکی از کارهایی که مثلا من انجام می دم تغییر نوع یک ستون از یک جدول هست. ابتدا سعی می کنم به صورت معمولی این کار رو انجام بدم اگر نشد (یعنی بلوک try من یک خطا تولید کرد) از استراتژی دیگه ای برای تغییر نوع ستون استفاده می کنم. متاسفانه وقتی بلوک Catch من شکار می شه دیگه Transaction اون قدرت خودش رو نداره و دوست داره زودتر Rollback بشه ولی هنگام پرتاب شدن Exception از نظر Consistency دیتابیس هیچ مشکلی وجود نداره.
راه حلی وجود نداره که وقتی بلوک catch اجرا شد یه جوری به transaction بگم بابا اتفاقی نیوفتاده با تو نبود تو کارت رو ادامه بده ؟
AminSobati
سه شنبه 10 فروردین 1389, 15:37 عصر
سلام دوست عزیزم،
لطف کنین کدی که ما هم بتونیم خطا رو شبیه سازی کنیم پست بفرمایید (به همراه Try..Catchکه نوشتین)
manager
سه شنبه 10 فروردین 1389, 15:56 عصر
سلام دوست عزیزم،
لطف کنین کدی که ما هم بتونیم خطا رو شبیه سازی کنیم پست بفرمایید (به همراه Try..Catchکه نوشتین)
سلام حتما :
BEGIN TRANSACTION
CREATE TABLE Test123(A BIGINT NULL,B NVARCHAR(50) NULL)
GO
/* do somthing .. */
BEGIN TRY
/* do somthing for example try to alter column type */
ALTER TABLE Test123 DROP COLUMN C /* that raise error */
END TRY
BEGIN CATCH
ALTER TABLE Test123 DROP COLUMN B
END CATCH
COMMIT
GO
این کار باعث ایجاد پیغام خطای زیر می شه :
Msg 3930, Level 16, State 1, Line 9
The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.
دلیل چنین Transactionای هم مشخصه و اون اینکه مثلا من نمی دونم که در زمان اجرای دستور داخل بلوک try..catch آیا فیلدی با نام C ایجاد شده است یا نه مگر اینکه سعی کنم حذفش کنم وقتی بلوک catch اجرا بشه یعنی چنین فیلدی ایجاد نشده پس باید فیلد B رو حذف کنم. ولی انگار یه جای این منطق می لنگه ...
AminSobati
چهارشنبه 11 فروردین 1389, 02:22 صبح
در SQL Server مفهومی وجود داره به اسم Doomed Transaction (در عنوان تاپیک بهش اشاره کردین)، به این مفهوم که Transaction در شرایطی قرار میگیره که عملا Read Only هست و هر اقدام برای نوشتن در Log File غیر مجاز خواهد بود. دستورات DDL (مثل کاری که شما انجام میدین) میتونن Transaction رو به این حالت دربیارن (و البته چند حالت دیگه). ناچاریم کدمون رو به شکلی تغییر بدیم که در این تله گرفتار نشیم! اگر برای شما امکان داره، با کوئری گرفتن از sys.columns وجود فیلد رو چک کنین بعد اقدام به حذفش کنید
manager
چهارشنبه 11 فروردین 1389, 09:22 صبح
بله بسیار عالی، حالا متوجه می شم که چرا مثلا وقتی یه ستون رو تو Enterprise Manager یا تو Management Studio تغییر می دیم این نرم افزارها کلی script تولید می کنند تا او تغییر نام یا تغییر رو ثبت کنند به جای اینکه از یه دستور Alter Column استفاده کنند در حقیقت فکر کنم اونها هم دارن از این تله فرار می کنن ..
ممنون.
AminSobati
چهارشنبه 11 فروردین 1389, 11:46 صبح
ضمنا دیدن این لینک هم خالی از لطف نخواهد بود:
http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c1fd034a-e75f-417f-920d-73eeb30c295a
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.