PDA

View Full Version : یک سوال مهم >>> لطفا بخوانید <<



atf
شنبه 15 اسفند 1383, 07:22 صبح
با عرض سلام خدمت همه دوستان

من میخواهم یکسری از دستورات transact sql از قبیل مثلا delete , insert , select ,update و غیره .... را پشت سر هم انجام دهم ولی می خوام اگه یکی از اون ها به هر دلیلی اجرا نشد بقیه هم (قبلی ها) فسخ شده و تغیرات به حالت اول بر گردند.؟؟؟؟

لطفا کمک کنید :گیج: :گیج: :گیج:

hr110
شنبه 15 اسفند 1383, 08:40 صبح
دستورات زیر برای این منظور است:

BEGIN TRANSACTION
COMMIT TRANSACTION
ROLLBACK TRANSACTION


begin transaction
...
update table-a
...
if &#40;condition-x&#41;
commit transaction
else if &#40;condition-y&#41;
update table-b
commit transaction
else
rollback transaction
begin transaction
update table-c
commit transaction

atf
شنبه 15 اسفند 1383, 09:10 صبح
ممنون از شما
اما اگه ممکنه یکمی بیشتر در مورد کدی که دادید توضیح بدید

متشکرم :sorry:

atf
شنبه 15 اسفند 1383, 09:20 صبح
آیا table ها هم باید از نوع خاصی باشند تا transaction رو ساپورت کند
:گیج:
لطفا کدی که آورده بودید هم توضیح دهید

بی نهایت ممنون :sorry:

esi022
شنبه 15 اسفند 1383, 12:02 عصر
begin transaction
DECLARE @a char&#40;50&#41;
IF @@ERROR &lt;> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
begin trans , end trans دستورات sql هستند که لیستی از دستورات رو میتونید بین
اونها اجرا کنید . متغیر محلی @@error هم در صورتی که بین این دو دستور مشکلی پیش بیاد مقدار میگیره
خالا اگه این مقدار صفر نباشه یعنی مشکل بوجود اومده و شما رویه رو ذخیره نمیکنید
rollback یعنی تغییراتو برگردون (‌یه چیزی تو ماه های غلط کردم )

atf
شنبه 15 اسفند 1383, 14:35 عصر
با تشکر از همه دوستان

اما چند تا مسئله هنوز مونده

اول اینکه ما دستور end transaction نداریم یا اینکه من تا حالا ندیدم
دوم اینکه آیا تا وقتیکه commit transaction اجرا نشده دستورات قبلی اجرا نمی شوند؟؟؟
و اینکه با این حساب من باید بعد از هر دستور با استفاده از متغیر error@@ چک کنم که error یی اتفاق نیافتاده باشد که اگر افتاد دستور rollback transaction را اجرا کنم و اگر هم نیافتاده دستور commit را .

اما فقط یکبار اجرای commit کافیه یا هر بار که دستوری رو می نویسیم بعد از چک کردن خطا commit رو اجرا کنم?????????????
:گیج:

esi022
شنبه 15 اسفند 1383, 14:52 عصر
سلام
اول اینکه نه end trans نداریم
دوم اینکه تا commit اجرا نشه دستورات اجرا نمیشه
سوم اینکه حرفت درسته
4 - یکبار کافیه

یه مثال دیگه واسه چند تا دستور

begin transaction
DECLARE @GUID uniqueidentifier
SET @GUID = NEWID&#40;&#41;
CREATE TABLE box_lang
&#40; id uniqueidentifier default newid&#40;&#41; PRIMARY KEY NONCLUSTERED NOT NULL,
content ntextو title nvarchar&#40;255&#41; NOT NULL, priority decimal&#40;15,0&#41; NOT NULL,
side tinyint NOT NULL &#41;
insert into docs_lang&#40;id,title&#41; values &#40;@GUID,N'New Document'&#41;
SELECT Max&#40;priority&#41; AS lastmax from xx_rtable

IF @@ERROR &lt;> 0
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
:موفق: :mrgreen:

esi022
شنبه 15 اسفند 1383, 14:57 عصر
اینم مطالعه کن
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ba-bz_96zy.asp

atf
دوشنبه 17 اسفند 1383, 08:06 صبح
ممنون از تمامی دوستان عزیز :موفق: