PDA

View Full Version : نحوه استفاده از تراکنشها



rooshan2008
یک شنبه 21 مهر 1387, 00:02 صبح
سلام

با کسب اجاز از اساتید و همه بزرگان برنامه نویسی این تالار پر بیننده....




تراکنش ها


یک تراکنش واحدی از کار است که در آن یا پردازش تمام دستورات با موفقیت انجام می شود و یا هیچ کدام پردازش نمی شوند.
تراکنشها کاربردهای بسیار زیادی دارند...
برای مثال یک تحویلدار بانک 50 هزار تومان را از یک حساب جاری به حساب پسنداز منتقل میکند در اینجا حساب جاری باید 50 هزار تومان بدهکار و حساب پس انداز 50 هزار تومان بستانکار می شود حالا اگر تحویل دار فراموش کند که 50 هزار تومان را به حساب پس انداز وارد کند چه اتفاقی رخ می دهد؟ ()



به این تعریف یک تراکنش گفته می شود.

تراکنش ها داری چهار خصیصه هستند که عبارت اند از :

:یا همه آنها انجام می شوند ویا هیچ بخشی از آن اجرا نمی شود. Atomic:


Consistent:یک تراکنش پس از اجرای موفقیت آمیز و یا شکست ، پایگاه داده را در وضعیت سازگار قبل تراکنش حفظ میکند .

Isolated: یک تراکنش در صورت عدم برخورد یا ارتباط با سایر تراکنشهای پایگاه داده ایزوله یا مجزا نامیده می شود
Durable : اگر تضمین تکمیل یک کار صرفنظر از آنچه در یک پایگاه داه پس از اتمام موفقیت آمیز تراکنش واقع می شود وجود داشته باشد آنگاه تراکنش با دوام نامیده می شود.در این شرایط اگر برق سیستم دچار مشکل شود و یا سرویس دهنده پایگاه داده خراب شود ، کامل بودن تراکنش پس از شروع مجدد سرویس دهنده تضمین شده خواهد بود.

انواع تراکنشها :
سه نوع تراکنش صریح (explicit) ، ضمنی (impLicit) و خودکار (Autocommit)وجود دارند.

که من در این جا فقط صریح(explicit) رو با مثال هم در Query Analyzer و هم طریقه پیاده سازی آن با دستورات vb.netرو می گم اگه استقبال شد دوتای دیگه رو هم می گم ..البته این رو هم بگم که من همه مطالب در این حوزه رو کامل نمی دونم و چیزایی که در مثال ها می بینید نتیجه کمی تجربه در Projet هایی هست که انجام دادم و مطاله هست و احتمال خطا در اون زیاد هست خواهش می کنم اگه اشکالی داره ذکر کنید و من رو هم عف کنید.
کلمات رزرو شده عبارتاند از:





Begin tran[saction] شروع کار یک تراکنش
Commit tran [saction] برای تکمیل و ثبت تغییرات و در نتیجه تکمیل یک تراکنش
RollBack Tran[saction] برای لغو تراکنش
Save Tran [SavePoint ] باعث میشود یک نقطه ایجاد شود




شاید چون هنوز طریقه کار رو نگفتیم یکم گنگ بنظر برسه ولی با مثال هایی که در ادامه می زنم حل میشه

البته چند تایی دیگه وجود داره که فعلاً یکم کم حوصله هستم.



مثال توضیح در مورد مثال :

این برنامه یک تراکنش رو ایجاد می کنه که یک رکورد به جدول پایگاه داه ما اضافه می کنه ولی فعلاً فقط یک تراکنش سادست و هیچ کاری انجام نمیده
این دستورا ت رو می تونید داخل کنهQuery Analyzer اجرا کنید البته دقت کنید که اسم جدول من با جدول مورد نظر شما امکان داره فرق کنه پس دستور insert رو اونطوری که دوست دارید بنویسید





Begin tran
Insert into Roshanfekr (a,b) values(‘ایران’,’گیلان’(
Commit tran



حالا به این مثال نگاه کنید :

مثال :

توضیح مثال :در این مثال من قصد دارم یک رکورد جدید و یک رکورد را حذف کنم و اگر در صورتی که خطایی در هر کجایی این دستورات در هنگاه اجرا رخ داد بی خیال شه (یعنی نه خانی اومده و نه خانی رفته چه برسه به دستور.. )

یعنی حتی از اون رکوردی که ایجاد کرده بودیم هم صرف نظر می کنه و چیزی ایجاد نمیشه.




این دستورا ت رو می تونید داخل کنهQuery Analyzer اجرا کنید




Begin tran
Insert into Roshanfekr (id,a,b) values(20,‘ایران’,’گیلان’(
Delete from Roshanfekr where id= 25
If (@@ERROR<>0 )
RollBack
else
Commit tran







این هم کد vb.net :





Dim Connecting As New System.Data.SqlClient.SqlConnection
Dim Command1 As New SqlClient.SqlCommand
Dim Tran As Data.SqlClient.SqlTransaction
Connecting.ConnectionString = Con_String()
Connecting.Open()
Tran = Connecting.BeginTransaction
Command1.Connection = Connecting
Command1.Transaction = Tran

Try
Command1.CommandText = "Insert into Roshanfekr (id,a,b( values(2,'گیلان','ایران')"
Command1.ExecuteNonQuery()

Command1.CommandText = "delete from roshanfekr where id=25"
Command1.ExecuteNonQuery()
Tran.Commit()
Catch ex As Exception
Tran.Rollback()
End Try








احتمال داره شما بگید این که اصلاً خطا نمیده که برگرده عقب ببینیم برای این کار شما تو دستور دوم یک چیز بنویسید مثل این :

Command1.CommandText = "delete from roshanfekr where id=’Program_vb@yahoo.com’"

این کد برای جدول من خطا میده چون فیلد ایدی من از نوع عددی هست ..
Save Tran: :بعضی وقت ها هست که ما می خوایم اگه در نقطه ای از برنامه خطا داد تا نقطه خاصی به عقب برگردیم وتغییراتی رو که تا قبل از خطا رخ داده ثبت بشه گردیم
مثال :
توضیح مثال :من در این مثال یک رکورد جدید ایجاد می کنم و یک رکورد ویرایش ویک رکورد رو حذف می کنم و یک رکورد دیگه هم بخاطر شما اضافه می کنم ولی اگه بعد از دستور ویرایش هر جا خطا داد به هر دلیلی تا بعد از دستور ویرایش برگرد عقب :







Begin tran
Insert into Roshanfekr (id,a,b) values(32,‘ایران’,’گیلان’(
update Roshanfekr set a=’به امید موفقیت همه شما’ where id=20
Save Tran best
Delete from Roshanfekr where id= 25
Insert into Roshanfekr (id,a,b) values(32,‘ایران’,’لشت نشا’(

If (@@ERROR<>0 )
RollBack Tran best
else
Commit tran










مشابه اون تو vb.net ...



Dim Connecting As New System.Data.SqlClient.SqlConnection
Dim Command1 As New SqlClient.SqlCommand
Dim Tran As Data.SqlClient.SqlTransaction
Connecting.ConnectionString = Con_String()
Connecting.Open()
Tran = Connecting.BeginTransaction
Command1.Connection = Connecting
Command1.Transaction = Tran
Try
Command1.CommandText = "Insert into Roshanfekr (id,a,b) values(4,'گیلان','ایران')"
Command1.ExecuteNonQuery()
Command1.CommandText = "update Roshanfekr set a=’به امید موفقیت همه شما’ where id=20"

Try
Command1.ExecuteNonQuery()
Tran.Save("Roshan")
Command1.CommandText = "delete from roshanfekr where id='Gilan'"
Command1.ExecuteNonQuery()
Command1.CommandText = "Insert into Roshanfekr (id,a,b) values(4,'گیلان','لشت نشا’)

Command1.ExecuteNonQuery()
Tran.Commit()
Catch ex As Exception
Try
Tran.Rollback("Roshan")
Catch ex1 As SqlClient.SqlException
If Not Tran.Connection Is Nothing Then
MsgBox("An exception of type " & ex.GetType().ToString() &" was encountered while attempting to roll back the transaction.")
End If
End Try
End Try

Catch ex As Exception
Tran.Rollback()
End Try







البته قسمت دوم این کد رو خودم قبلاً مشکل داشتم و یه سر به msdn online مایکروسافت زدم این طوری گفته بود و من از اون موقعه تا حالا این طوری می نویسم ولی قبل از اون یه مشکلی که من با اون داشتم این بود که وقتی این دستور زیر



Command1.CommandText = "delete from roshanfekr where id='sds'"
Command1.ExecuteNonQuery()





رو استفاده می کردم چون خطای نوشتاری هست باعث می شد رشته ارتباط با بانک من قطع بشه یعنی tran.Connection=Nothing می شد واین همیشه برام سوال بود البته منطقی هم هست که شما دستور بالا رو اینطوری نباید بنویسید ولی من مشکلم رو اینطور حل کردم (چون فیلد id از نوع Bigint هست )




Dim Connecting As New System.Data.SqlClient.SqlConnection
Dim Command1 As New SqlClient.SqlCommand
Dim Tran As Data.SqlClient.SqlTransaction
Connecting.ConnectionString = Con_String()
Connecting.Open()
Tran = Connecting.BeginTransaction
Command1.Connection = Connecting
Command1.Transaction = Tran
Try
Command1.CommandText = "Insert into Roshanfekr (id,a,b) values(4,'گیلان','ایران')"
Command1.ExecuteNonQuery()
Command1.CommandText = "update Roshanfekr set a='همیشه' where id=20"
Command1.ExecuteNonQuery()
Tran.Commit()
Tran = Connecting.BeginTransaction
Command1.CommandText = "delete from roshanfekr where id='sds'"
Command1.ExecuteNonQuery()
Command1.CommandText = "Insert into Roshanfekr (id,a,b) values(4,'گیلان','ایران')"
Command1.ExecuteNonQuery()
Tran.Commit()
Catch ex As Exception

Tran.Rollback()



End Try




البته این رو هم می دونستم که این کار من باعث افزایش بیش از اندازه فایل تراکنش من می شه و خوب نیست ولی مجبور بودم(یا ثبت تراکنش رو غیر فعال می کردم) اگه دوستان محبت کنن و راه بهتر هم بگن من واقعاً ممنون می شم.

البته دوستان می دونم که این چیزایی که گفتم ساده بود ولی یه بهانه ای شد، هم نظر شما رو بدونم ، و هم خودم یکم مرور کنم از همه ی دوستان که در برنامه نویس به سوالات امثال من جواب می دن واقعاً تشکر می کنم

راستی من تمام کد ها رو اجرا گرفتم..اگه جایی اشکال داره حتماً بگین تا مطلب به دوستای دیگه بد انتقال داده نشه .اگه لایق تشکر بودم....... خوشحالم می کنید.

اگه خواستین در باره Linq هم یه چیزای مختصری بگم، دستور بفرمایید اطاعت می شه

rooshan2008
یک شنبه 21 مهر 1387, 23:39 عصر
بازم سلام
دوستان یه نظر می دادین من رو دلگرم می کردین بد نبود

neginesabzesade
سه شنبه 05 آذر 1387, 15:18 عصر
سلام ممنون از اطلاعاتتون یه سوال داشتم که اگه جواب بدید ممنون می شم
حالا اگه چند تا sp رو پشت هم تو برنامه اجرا کنیم و بخواهیم روی تمام اونا try catch انجام بشه چه جوری میشه این کارو کرد ( sp تو sql نوشت و اینجا استفاده کرد) ؟
ببینید من تو برنامم چند تا عملیات پشت سرهم دارم که می خوام هر کدوم اجرا نشد کل عملیات کنسل شه اما نمی دونم چه جوری..
برنامم این طوریه که چند تا function رو call می کنم که تو هر کدوم یه sp اجرا می شه( که حالا شاید بتونم همه اون sp ها رو یکی کنم) اما تو یکی از function هام از یه webrefrence استفاده می کنم که می خوام اگه اونم error داد کل عملیات کنسل شه
حالا می خوام بدونم اگه تو sp ها از try catch استفاده نکنم و اول و آخر این چند خط try catch بذارم درست عمل می کنه؟:گیج:

rooshan2008
سه شنبه 05 آذر 1387, 23:20 عصر
ُلام
بله درست کار می کنه مثلاً من قبلاً استفاده کردم مثلاً:
این کد ببینید:



Connecting.ConnectionString =

"Persist Security Info=False;User ID=sa;Password =;Initial Catalog=northwind ; Data Source=(local)"

Connecting.Open()

Tran = Connecting.BeginTransaction
Command1.Transaction = Tran
Command1.Connection = Connecting
Try
insert_Roshan_1()
insert_My_1()
Command1.Transaction.Commit()
Catch ex As Exception
Command1.Transaction.Rollback()
EndTry





اگر داخل try و یا داخل خود توابه insert_Roshan_1وinsert_My_1 خطایی رخ بده تمام کارها کنسل مشه.:تشویق:
باتشکر....

mahdymorady
چهارشنبه 23 اردیبهشت 1388, 14:25 عصر
بنده از طرف خودم و تمامی بازدید کنندگان از زحمت حضرتعالی و مطلب بسیار مفیدتان تشکر می کنم. واقعا خسته نباشید و امیدوارم که دوستان هم حداقل کاری که در مقابل بزرگواری دوستان فاضلمان که بدون هیج جشمداشتی اطلاعات ذیقیمتخود را در اختیار ما قرار می دهند حداقل دکمه ی تشکر را کلیک بفرمایند!
مجددا سپاسگزارم جناب rooshan2008
همراه با بهتریت آرزوها.ارادتمند : مرادی