alireza sh
مدیر بازنشسته
برای استفاده از قابلیت های Tranaction در داخل stored procedure های Sql Server به این شکل عمل میکنیم :
فرض کنید در حال ایجاد برنامه ای برای مدیریت دانشجویان و کلاسها هستیم . هر کلاس ظرفیتی دارد و در جدول کلاس ، فیلدی داریم که تعداد نفرات فعلی کلاس را نشان میدهد
همچنین جدولی داریم که دانشجویان وارد شده را نشان میدهد و هر دانشجویی که وارد میشود ، در این جدول دارای یک رکورد است . بنابراین بلافاصله پس از ثبت رکورد دانشجوی وارد شده ، میبایست جدول کلاس نیز به روز گردد .
تصور کنید رکورد دانشجو ثبت نشود اما به تعداد دانشجویان کلاس یکی افزوده گردد ! یا برعکس !
در این مواقع برای حل مشکل از transaction ها استفاده میکنیم . transactionها به ما کمک میکنند تا دو یا چند دستور SQL به صورت یک بلوک اجرا شوند . یعنی اگر یکی از دستورها با مشکل برخورد ، تغییرات اعمال شده توسط دیگر دستور ها لغو گردد .
مثال :
فرض کنید در حال ایجاد برنامه ای برای مدیریت دانشجویان و کلاسها هستیم . هر کلاس ظرفیتی دارد و در جدول کلاس ، فیلدی داریم که تعداد نفرات فعلی کلاس را نشان میدهد
همچنین جدولی داریم که دانشجویان وارد شده را نشان میدهد و هر دانشجویی که وارد میشود ، در این جدول دارای یک رکورد است . بنابراین بلافاصله پس از ثبت رکورد دانشجوی وارد شده ، میبایست جدول کلاس نیز به روز گردد .
تصور کنید رکورد دانشجو ثبت نشود اما به تعداد دانشجویان کلاس یکی افزوده گردد ! یا برعکس !
در این مواقع برای حل مشکل از 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]