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 هم یه چیزای مختصری بگم، دستور بفرمایید اطاعت می شه
با کسب اجاز از اساتید و همه بزرگان برنامه نویسی این تالار پر بیننده....
تراکنش ها
یک تراکنش واحدی از کار است که در آن یا پردازش تمام دستورات با موفقیت انجام می شود و یا هیچ کدام پردازش نمی شوند.
تراکنشها کاربردهای بسیار زیادی دارند...
برای مثال یک تحویلدار بانک 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 هم یه چیزای مختصری بگم، دستور بفرمایید اطاعت می شه