PDA

View Full Version : خروجی در @@TRANCOUNT



fakhravari
سه شنبه 15 مهر 1393, 02:35 صبح
BEGIN TRAN
SELECT * FROM [Categories]
IF @@TRANCOUNT = 0
ROLLBACK
ELSE
COMMIT




سلام در خروجی فوق 0 TRANCOUNT است
چرا ROLLBACK نمیشه:اشتباه:

یا
BEGIN TRAN
SELECT * FROM [Categories]
IF (@@ERROR = 0)
ROLLBACK
ELSE
COMMIT

pezhvakco
سه شنبه 15 مهر 1393, 10:17 صبح
سلام در خروجی فوق 0 TRANCOUNT است
چرا مقدار TranCount@@ و Error@@ را صفر در نظر گرفته اید


هر بار که شما BEGIN TRANSACTION را صدا می زنید به مقدار @@TRANCOUNT یکی اضافه می شود

شاید راهنمایی خوبی برایتان باشند :

http://www.nikamooz.com/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86/sql-server-vs-net/sql-server-design/188-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AA%D8%B1%D8%A7%DA%A9%D9%86%D8%B4-%D8%A8%D9%87-%D8%AF%D8%A7%D9%85-%D8%A7%D9%86%D8%AF%D8%A7%D8%AE%D8%AA%D9%86-%D8%AE%D8%B7%D8%A7-error-trapping-%D8%A8%D9%88%D8%B3%DB%8C%D9%84%DB%80-try%E2%80%A6catch.html

http://www.nikamooz.com/%D9%85%D9%82%D8%A7%D9%84%D8%A7%D8%AA-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86/sql-server-vs-net/sql-server-design/185-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AA%D8%B1%D8%A7%DA%A9%D9%86%D8%B4-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-%D8%AA%D8%B1%D8%A7%DA%A9%D9%86%D8%B4-%D9%88-%D8%AA%D8%B9%D8%B1%DB%8C%D9%81-%D8%A2%D9%86.html

fakhravari
سه شنبه 15 مهر 1393, 11:02 صبح
میخوام خطا نداشت ROLLBACK بشه:لبخند:

pezhvakco
سه شنبه 15 مهر 1393, 12:03 عصر
1) خطاهایی هستند که با Error@@ به دام نمی افتند مثل Conversion Failed
2) خطا هایی که در جدول خطا های SQL هستند و تاثیر گذار هستند از 21 بالاتر هستند
3) اگر این دستور را داخل یک SP بکار برده اید، یک دستور Return هم پس از RollBack بنویسید
...
اگر میتوانید اصل دستور را برای خطا گیری این جا بنویسید

fakhravari
سه شنبه 15 مهر 1393, 14:50 عصر
BEGIN TRANDECLARE @I INT
SELECT @I = COUNT(*) FROM [Categories]
IF @I = 6
ROLLBACK
ELSE BEGIN
SELECT * FROM [Categories]
COMMIT
END

pezhvakco
چهارشنبه 16 مهر 1393, 11:36 صبح
من دلیل این ساختار کدنویسی شما رو نفهمیدم .
اگه اشتباه نباشه : دستور RollBack برای برگرداندن تغییرات انجام شده بر روی داده ها از ابتدای Begin Tran تا محل کد دستور RollBack به حالت پیش از شروع Begin Tran و ادامه ندادن دیگر دستورات داخل تراکنش (Begin Tran) است
=> شما هیچ گونه عملیات ویرایشی بر روی داده ها انجام ندادی.

خواسته شما از انجام این نوع کدنویسی چی هست چون به فکر من روش شما نادرست است

fakhravari
جمعه 18 مهر 1393, 12:09 عصر
بله درسته من مد نظرم درستی اجرا بود

RollBack < روی select میشود اعمال شد؟
اگر درست بود بر خلاف خطا میخواستم استوپ بشه:لبخند:

pezhvakco
جمعه 18 مهر 1393, 17:10 عصر
اگر درست بود بر خلاف خطا میخواستم استوپ بشه
دستور RollBack برای Stop کردن نیست .

اگر این دستورات را داخل SP اجرا می کنید

BEGIN TRANDECLARE @I INT

SELECT @I = COUNT(*) FROM [Categories]

IF @I = 6

Begin
RollBack
Return 1
End

ELSE BEGIN

SELECT * FROM [Categories]

COMMIT

END

fakhravari
شنبه 19 مهر 1393, 10:35 صبح
پس
Begin Tran فقط بر روی Error@@ عکس العمل نشون میده

یعنی میتونیم خرابی چک کرد.
----------------------------------------------------------------------------------
اگه ممکنه چنتا
Begin Tran با نام های مختلف مثال بزنید که هر کدوم خواستیم RollBack,COMMIT کنیم:متفکر: