PDA

View Full Version : کمک در استفاده از transaction



mohsenm66
پنج شنبه 08 دی 1390, 12:44 عصر
من یه db دارم که باید اطلاعات به صورت همزمان در 3 جدول ثبت شود و میخواهم اگر در یکی از این جداول ثبت صورت نگرفت کلیه عملیات لغو شود . کلی تحقیق کردم فهمیدم باید از trans استفاده کنم ولی نحوه استفاده از این دستور را بلد نیستم (خیلی مبتدی هستم ) و یکسری نمونه هم در سایت پیدا کردم ولی نمیدونم که باید این دستورات را در کجا بنویسم و اصلا این دستورات چه کاری را انجام می دهند. در ضمن در جدول اول یک فیلد کد دارم که از نوع autonumber است و این کد باید به عنوان شناسه در 2 جدول دیگر تکرار شود .
از کلیه دوستان برنامه نویس تقاضا دارم من را در انجام این کار یاری کنند .

یوسف زالی
پنج شنبه 08 دی 1390, 13:42 عصر
دوست عزیز این سوال رو در تاپیک قبلیتون همراه با نمونه کد براتون جواب دادم.
شما در کدوم قسمت مشکل دارید؟

mohsenm66
پنج شنبه 08 دی 1390, 17:59 عصر
دوست عزیز ناراحت نشو بالاخره ما تازه کاریم
من در قسمت های زیر مشکل دارم :
1- چگونه میشه متوجه شد که خطایی رخ داده
2-اگر خطایی رخ داد چطوری میشه فهمید خطا از کجاست
3-اگر خطا رخ داد عملیات باید لغو بشه با چه دستوری این کار انجام میشه و کاربر چطوری متوجه میشه که عملیات متوقف شده است(البته این قسمت مربوط به برنامه نویسی میشه)
4- بعد از اینکه یک دستور انجام شد آیا دستور بعدی را باید ادامه دستور قبلی نوشت یا اینکه یه دستور یا یک جداکننده ای لازم دارد (منظورم Go در sql است من نمیدانم این دستور را چه موقعی باید استفاده کنم )

یوسف زالی
پنج شنبه 08 دی 1390, 23:54 عصر
من ناراحت نشدم. در حقیقت تذکر دادم که تاپیک رو تکرار نکنید.
ترنس اکشن با وقوع خطا خودش با تمام دستورات درونش به حالت قبل از اجرا بر می گردند.
در انتهای دستوراتتون می تونید یک عدد ریترن کنید که اگر تمام ترنس اکشن اجرا شد اون خط هم با اجرا شدنش مقداری رو ست کنه و در نهایت به خروجی ببره.
در مورد شبه دستور GO هم نیازی به این کار نیست.
تمام ترنس اکشن باید یک بچ باشه.
در این مورد در همین سایت کلمه Go رو سرچ کنید.
موفق باشید.

mohsenm66
جمعه 09 دی 1390, 08:34 صبح
تمام ترنس اکشن باید یک بچ باشه.
در این مورد در همین سایت کلمه Go رو سرچ کنید.
موفق باشید.
منظورتون از بچ چیه ؟
کلمه GO را سرچ کردم ولی چیزی پیدا نکردم .
میشه لطف کنی و در مورد دستور زیر توضیح بدی ؟
SET XACT_ABORT ON
BEGIN TRAN

IF @@ERROR <> 0 AND @@TRANSACTION > 0 ROLLBACK
ELSE
COMMIT TRAN
SET XACT_ABORT OFF

یوسف زالی
جمعه 09 دی 1390, 15:06 عصر
در مورد بچ:

The following rules apply to using batches:

CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER, and CREATE VIEW statements cannot be combined with other statements in a batch. The CREATE statement must start the batch. All other statements that follow in that batch will be interpreted as part of the definition of the first CREATE statement.
A table cannot be changed and then the new columns referenced in the same batch.
If an EXECUTE statement is the first statement in a batch, the EXECUTE keyword is not required. The EXECUTE keyword is required if the EXECUTE statement is not the first statement in the batch.
در مورد XACT_ABORT:

When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.
When SET XACT_ABORT is OFF, in some cases only the Transact-SQL statement that raised the error is rolled back and the transaction continues processing. Depending upon the severity of the error, the entire transaction may be rolled back even when SET XACT_ABORT is OFF. OFF is the default setting.
Compile errors, such as syntax errors, are not affected by SET XACT_ABORT.
XACT_ABORT must be set ON for data modification statements in an implicit or explicit transaction against most OLE DB providers, including SQL Server.

در مورد @@TRANSACTION :
در حقیقت اشتباه نوشتید.
اون TransCount@@ هست و معین می کنه در کدوم ترنس اکشن هستیم و شماره ترنس اکشن رو بر می گردونه.

در مورد Error@@ :
کد اروری که اتفاق افتاده بر می گرده.
اگر صفر بود اروری اتفاق نیفتاده.
موفق باشید.