PDA

View Full Version : جاوگیری از انجام فرایندها با transaction و @@error درست است؟؟



ali_yousefian19
شنبه 21 شهریور 1388, 02:07 صبح
با سلام و خسته نباشین
سرچ کردم جواب نگرفتم:چشمک:
من یک پروسیجر نوشتم که باید در سه جدول insert کنه و سپس دو تا پروسیجر دیگه را صدا میزنه
خوب مبخوام اگه اروری در طول این کارها رخ داد هیچ کدوم از این فرایندها انجام نشه مثلا اگه در insert در جدول سوم مشکلی پیش اوومد یا در اجرای پروسیجر داخلی ، هیچکدوم از فرایندها انجام نشه
من از دستور زیر استفاده کردم


create procedure test
@t1_name
AS
begin transaction
insert into tbl1(t1_name) values (@t1_name)
insert into tbl2(t1_name) values (@t1_name)
insert into tbl2(t1_name) values (@t1_name)
exec usp_testproc1 @t1_name
exec usp_testproc2 @t1_name
exec usp_testproc2 @t1_name

if(@@error<>0)
BEGIN
ROLBACK TRANSACTIN
END
COMMIT TRANSACTION

اما دوستم میگه اینکار درست جواب نمیده و باید در پروسیجرهای داخلی مقداری را بر گردونی و آنها را چک کنی ولی با توجه به اینکه من در کل پروژم حدود 20 تا از این پروسیجرها دارم ویرایش کل اوونها کاره سختی هست
به نظر شما کار من درسته یا باید کاری که دوستم گفته را انجام بدم؟نظر بهتری ندارین
ممنون
امیدوارم هر جا هستید موفق و شاد باشید

meysam_pro
شنبه 21 شهریور 1388, 23:48 عصر
خب یقینا جواب درستی نخواه داشت! متغیر سیستمی @@error خطای تولید شده در دستور بلافاصله قبلی رو بر میگردونه(عقلانی هم هست، اگه چند تا دستور با هم خطا بدن ، مقدار کدوم یکی رو باید بر گر دونه؟؟)

یک کار میشه کرد. واسه تک تک دستور ها ، به عنوان یک تراکنش در نظر بگیرین و در آخر با متغیر سیستم @@TRANCOUNT وضعیت رو بررسی کنید.
توضیح دستور طبق متن Books Online:

The BEGIN TRANSACTION statement increments @@TRANCOUNT by 1. ROLLBACK TRANSACTION decrements @@TRANCOUNT to 0, except for ROLLBACK TRANSACTION savepoint_name, which does not affect @@TRANCOUNT. COMMIT TRANSACTION or COMMIT WORK decrement @@TRANCOUNT by 1.

ali_yousefian19
یک شنبه 22 شهریور 1388, 00:33 صبح
ممنون از جوابت میثم جان
من متن شما را خوندم و help از sql هم دیدم ولی نتونستم بطور کامل متوجه شم چطوری میشه از @@trancecount استفاده کرد ولی بهر حال برام یک ایده بوجود آورد که در زیر نوشتم ، ممنون میشم اگه بگین این روش درست جواب مبده یا نه و همینطور برای پروسیجرها کار میده یا نه



declare @s char(10)
select @s='OK'
BEGIN TRANSACTION
insert into table1 (t_name) values ('ali')
IF @@ROWCOUNT <>1
@s='not ok'
insert into table1 (t_name) values ('reza')
IF @@ROWCOUNT <> 1
@s='not ok'

exec proctest 'ali'
IF @@ROWCOUNT <> 1
@s='not ok'


if (@s='ok')
COMMIT TRAN

IF @s <> 'ok'
BEGIN
PRINT 'A transaction needs to be rolled back'
ROLLBACK TRAN
END

بازم ممنونم

meysam_pro
یک شنبه 22 شهریور 1388, 02:39 صبح
هر BEGIN TRANSACTION یه دونه مقدار رو اضافه میکنه و هر COMMIT TRANSACTION or COMMIT WORK یه دونه کم میکنه. به محض رسیدن به ROLLBACK TRANSACTION ، صفر میشه(به غیر از جاهایی که از savepoint استفاده بشه.

با @@ROWCOUNT فکر کنم جواب درستی نگیرین(SP ها چی کار میکنن، فقط Row manipulation ؟) اگه اینجوره چه نیازی به Tran هست؟

ali_yousefian19
دوشنبه 23 شهریور 1388, 15:12 عصر
سلام آقا- من در پروسیجرهام بر اساس پارامتر ورودی ممکنه دو اینسرت یا یک اینسرت یا ... داشته یاشم

هر BEGIN TRANSACTION یه دونه مقدار رو اضافه میکنه و هر COMMIT TRANSACTION or COMMIT WORK یه دونه کم میکنه. به محض رسیدن به ROLLBACK TRANSACTION ، صفر میشه(به غیر از جاهایی که از savepoint استفاده بشه.


مهندس این که ترجمه همون چیزیه که در help از sql نوشته من تونستم ترجمش کنم مثالشم دیدیم ولی نتونستم بفهمم برای کار خودم چطوری میتونم استفاده کنم،اگه میتونین راهنمایی کنین

بازم ممنونم از پیگیریتون -
با تشکر

corona
جمعه 03 مهر 1388, 18:32 عصر
دوست من بعد از هر insert بیا ERROR@ رو چک کن ببین اگه مخالف 0 بود insert بعدی رو انجام بده
من تو برنامه خودم اینحوری کار کردم ، درست هم کار میکنه . حالا اگه ناشیانه است دیگه باید ببخشید



begin transaction Add_Stock

-- Insert Acount to Account Table
insert into tbl_Acount values (@acctype , @accbankname , @acccode , @accbranchcode) ;

if(@@ERROR = 0)
begin
--Insert Stock Holder information to its table
insert into tbl_Stock values( @name , @surname ,@identificationNumber , @fathername , @birthdate,
@publishPlace , @internationalnumber ,@stranumber,@boynumber ,@grilnumber,
@childcount,@retirementdate , @serviceplace , @retirementdegree ,@bodycondition,
@stockholdercode,@stockcount , @puresalary,@drivinglicence,@drivinglicencetype,
@familiaritywithheavy,@familiaritywithlight,@expwi thtaxioff,@expwithtaxioffdur,
@expwithaja,@expwithajadur,@serviceclass,@homeaddr ess,@cellnum,@constnum,@postalcode,
@acccode,@disabilityprecent,@precode,@salarytype,@ memdate,@busexp)
end

if @@ERROR = 0
commit transaction Add_Stock
else
rollback transaction Add_Stock


RETURN