• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

آموزش : کار با TRANSACTION در داخل Stored Procedure

alireza sh

مدیر بازنشسته
تاریخ عضویت
2 ژانویه 2006
نوشته‌ها
2,775
لایک‌ها
70
سن
41
محل سکونت
نصف جهان
برای استفاده از قابلیت های Tranaction در داخل stored procedure های Sql Server به این شکل عمل میکنیم :

فرض کنید در حال ایجاد برنامه ای برای مدیریت دانشجویان و کلاسها هستیم . هر کلاس ظرفیتی دارد و در جدول کلاس ، فیلدی داریم که تعداد نفرات فعلی کلاس را نشان میدهد

همچنین جدولی داریم که دانشجویان وارد شده را نشان میدهد و هر دانشجویی که وارد میشود ، در این جدول دارای یک رکورد است . بنابراین بلافاصله پس از ثبت رکورد دانشجوی وارد شده ، میبایست جدول کلاس نیز به روز گردد .

تصور کنید رکورد دانشجو ثبت نشود اما به تعداد دانشجویان کلاس یکی افزوده گردد ! یا برعکس !

در این مواقع برای حل مشکل از transaction ها استفاده میکنیم . transactionها به ما کمک میکنند تا دو یا چند دستور SQL به صورت یک بلوک اجرا شوند . یعنی اگر یکی از دستورها با مشکل برخورد ، تغییرات اعمال شده توسط دیگر دستور ها لغو گردد .

مثال :

کد:
تعریف stored procedure

Create PROCEDURE [AddStudentToClass]
	(@StudentID	[nvarchar](50),
	 @StudentName 	[nvarchar](50),
	 @ClassID 	[nvarchar](60)
	 )
	

AS

[COLOR="Blue"][B]BEGIN TRANSACTION[/B][/COLOR]


ابتدا رکورد دانشجو را ثبت میکنیم :

 INSERT INTO StudentClass 
	 (StudentID,StudentName,ClassID) 
 
VALUES 
	(@StudentID,@StudentName,@ClassID) 

بررسی میکنیم که آیا خطایی رخ داده است ؟

[B]	IF @@ERROR <> 0[/B]


	BEGIN
در صورت رخ دادن خطا تغییرات را لغو میکنیم
		[COLOR="Red"][B]ROLLBACK[/B][/COLOR]
یک پیغام خطا میفرستیم
	    RAISERROR ('Error Adding Student Record', 16, 1)
    RETURN
 END

اکنون سعی میکنیم تعداد دانشجویان کلاس را به روز کنیم :
	
	UPDATE [Class] SET ClassNowStudents= ClassNowStudents+1
	WHERE ClassID= @ClassID
	
و مانند بخش قبل .....

	IF @@ERROR <> 0
 BEGIN

    [B][COLOR="Red"]ROLLBACK[/COLOR][/B]
    RAISERROR ('Error Updating Count of Students in Class', 16, 1)
    RETURN
 END

در این مرحله ، با توجه به اینکه مشکلی پیش نیامده ، پس تغییرات را اعمال نهایی میکنیم  
[COLOR="Blue"][B][I]COMMIT[/I][/B][/COLOR]
 

the wizard

کاربر تازه وارد
تاریخ عضویت
8 آگوست 2009
نوشته‌ها
31
لایک‌ها
0
سلام من از کدی که شما نوشتین واسه کدم استفاده کردم اما نمی دونم چرا عمل نمی کنه یعنی اگر یکی از دستورات داخل tran انجام نشه بقیه تغییرات به حالت اول بر نمی گرده.
 

Sama1234

کاربر تازه وارد
تاریخ عضویت
18 نوامبر 2008
نوشته‌ها
1
لایک‌ها
0
برای استفاده از قابلیت های Tranaction در داخل stored procedure های Sql Server به این شکل عمل میکنیم :

فرض کنید در حال ایجاد برنامه ای برای مدیریت دانشجویان و کلاسها هستیم . هر کلاس ظرفیتی دارد و در جدول کلاس ، فیلدی داریم که تعداد نفرات فعلی کلاس را نشان میدهد

همچنین جدولی داریم که دانشجویان وارد شده را نشان میدهد و هر دانشجویی که وارد میشود ، در این جدول دارای یک رکورد است . بنابراین بلافاصله پس از ثبت رکورد دانشجوی وارد شده ، میبایست جدول کلاس نیز به روز گردد .

تصور کنید رکورد دانشجو ثبت نشود اما به تعداد دانشجویان کلاس یکی افزوده گردد ! یا برعکس !

در این مواقع برای حل مشکل از transaction ها استفاده میکنیم . transactionها به ما کمک میکنند تا دو یا چند دستور SQL به صورت یک بلوک اجرا شوند . یعنی اگر یکی از دستورها با مشکل برخورد ، تغییرات اعمال شده توسط دیگر دستور ها لغو گردد .

مثال :

کد:
تعریف stored procedure

Create PROCEDURE [AddStudentToClass]
	(@StudentID	[nvarchar](50),
	 @StudentName 	[nvarchar](50),
	 @ClassID 	[nvarchar](60)
	 )
	

AS

[COLOR="Blue"][B]BEGIN TRANSACTION[/B][/COLOR]


ابتدا رکورد دانشجو را ثبت میکنیم :

 INSERT INTO StudentClass 
	 (StudentID,StudentName,ClassID) 
 
VALUES 
	(@StudentID,@StudentName,@ClassID) 

بررسی میکنیم که آیا خطایی رخ داده است ؟

[B]	IF @@ERROR <> 0[/B]


	BEGIN
در صورت رخ دادن خطا تغییرات را لغو میکنیم
		[COLOR="Red"][B]ROLLBACK[/B][/COLOR]
یک پیغام خطا میفرستیم
	    RAISERROR ('Error Adding Student Record', 16, 1)
    RETURN
 END

اکنون سعی میکنیم تعداد دانشجویان کلاس را به روز کنیم :
	
	UPDATE [Class] SET ClassNowStudents= ClassNowStudents+1
	WHERE ClassID= @ClassID
	
و مانند بخش قبل .....

	IF @@ERROR <> 0
 BEGIN

    [B][COLOR="Red"]ROLLBACK[/COLOR][/B]
    RAISERROR ('Error Updating Count of Students in Class', 16, 1)
    RETURN
 END

در این مرحله ، با توجه به اینکه مشکلی پیش نیامده ، پس تغییرات را اعمال نهایی میکنیم  
[COLOR="Blue"][B][I]COMMIT[/I][/B][/COLOR]




سلام
اگر دستور Insert درون یک procedure و update درون procedure دیگری باشد چگونه transaction کنترل می شود؟
 

iran1368

کاربر تازه وارد
تاریخ عضویت
3 مارس 2013
نوشته‌ها
1
لایک‌ها
0
سلام
من دانشجوی ارشد نرم افزار هستم
استادمون یه تمرین داده که
یک دیتابیس کوچک طراحی کنیم و از انواع ترنس اکشن های ( nested , distributed , chained , flat , Multilevel) روش پیداده سازی کنیم(نمونه های ترنس اکشن هارو روی دیتابیس اجرا کنیم ، همش رو در قالب یک برنامه)
من خیلی سعی کردم درست کنم ولی نتونستم
کسی هست کمکم کنه یا حداقل راهنمایی کنه تا چکار کنم؟؟؟
متشکرم
 
بالا