View Full Version : تراکنشهای SQL
bad_boy_2007
چهارشنبه 07 فروردین 1387, 22:15 عصر
سلام دوستان عزیز سال نو مبارک :لبخندساده:
چند تا سوال در مورد تراکنشها داشتم که درست و حسابی سر در نیاورم !!!
فرض کنید دستوراتی مشابه زیر داریم :
begin transaction
دستورات شماره 1
begin transaction
دستورات شماره 2
commit transaction
دستورات شماره 3
commit transaction
حالا سوال من اینه که RollBack Transaction در هر کدام از این بخشها باعث لغو کلیه دستورات میشود یا باعث لغو فقط بخشی از دستورات میشود اگر باعث لغو بخشی از دستورات میشود ، کدام دستورها Commit و کدام Rollback میشوند ؟؟؟
مهدی نان شکری
پنج شنبه 08 فروردین 1387, 00:02 صبح
با سلام و کسب اجازه از استاد ثباتی
در پایگاه داده ها تراکنش های تو در تو می تواند بسته و یا باز باشد.(Closed transaction or Open transaction) در تراکنش بسته ، اجرای زیر تراکنش بعد از تراکنش بیرونی آغاز می شود و تثبیت شدن آن ، منوط به تثبیت شدن تراکنش بیرونی است. که این موجب میشه تراکنش خاصیت Atomicity رو در بیرونی ترین تراکنش رعایت کند. ولی در مورد دوم این محدودیت وجود ندارد.
مرجع : کتاب سیستم مدیریت پایگاه داده ها - مفاهیم و تکنیک ها
تالیف : سید محمد تقی روحانی رانکوهی ، فصل اول ، صفجه 20
bad_boy_2007
پنج شنبه 08 فروردین 1387, 15:30 عصر
با سلام و کسب اجازه از استاد ثباتی
در پایگاه داده ها تراکنش های تو در تو می تواند بسته و یا باز باشد.(Closed transaction or Open transaction) در تراکنش بسته ، اجرای زیر تراکنش بعد از تراکنش بیرونی آغاز می شود و تثبیت شدن آن ، منوط به تثبیت شدن تراکنش بیرونی است. که این موجب میشه تراکنش خاصیت Atomicity رو در بیرونی ترین تراکنش رعایت کند. ولی در مورد دوم این محدودیت وجود ندارد.
مرجع : کتاب سیستم مدیریت پایگاه داده ها - مفاهیم و تکنیک ها
تالیف : سید محمد تقی روحانی رانکوهی ، فصل اول ، صفجه 20
از حرف شما اینطور برداشت کردم که در مجموعه دستورات 2 اگر Commit انجام بشه مجموعه دستورات 2 ثبت میشه ولی ممکنه مجموعه دستورات 3 ثبت بشه یا اینکه ثبت نشه ولی اگر بخش 3 ثبت نشد بخش 1 هم ثبت نخواهد شد به علت Atomicity بودن تراکنشها .
میشه بگید این برداشت من صحیح هست یا خیر ؟؟؟
مهدی نان شکری
پنج شنبه 08 فروردین 1387, 20:10 عصر
با سلام بسته به سیستم تون هست. که از کدام مورد باز یا بسته استفاده می کنه. به طور بسته اگه 2 تثبیت بشه ، تثبیت شدن اون بسته به این داره که پد آن که تراکنش بیرونی هست تثبیت می شه یا نه. اگه تراکنش پدر تثبیت شد تراکنش فرزند که همون 2 هست تثبیت می شه در غیر این صورت ROLLBACK اتفاق می افته.
ولی حالا فرض کنید تراکنش 2 ROLLBACK شد در این صورت واحد مدیر تراکنش ها در DBMS می تونه به روش های مختلف خودش رو ترمیم بده که عبارتند از:
1)زیر تراکنش طرد شده رو دوباره اجرا کنه
2)نقص پدید آمده در روند اجرای زیر تراکنش را نادیده یگیره. در این صورت زیر تراکنش ، Non-vital transaction تلقی می شه.
3)زیر تراکنش دیگری را به عنوان زیر تراکنش Contigency transaction اجرا کنه.
4)خود تراکنش پدر نیز ROLLBACK شود.
در پایان می گم این ها به DBMS خاصی اشاره نداره و ممکنه MS SQL از یک روش و ORACLE از روش دیگه ای بهره ببره.
مرجع از کتاب CONN 2002
bad_boy_2007
جمعه 09 فروردین 1387, 00:51 صبح
با سلام بسته به سیستم تون هست. که از کدام مورد باز یا بسته استفاده می کنه. به طور بسته اگه 2 تثبیت بشه ، تثبیت شدن اون بسته به این داره که پد آن که تراکنش بیرونی هست تثبیت می شه یا نه. اگه تراکنش پدر تثبیت شد تراکنش فرزند که همون 2 هست تثبیت می شه در غیر این صورت ROLLBACK اتفاق می افته.
ولی حالا فرض کنید تراکنش 2 ROLLBACK شد در این صورت واحد مدیر تراکنش ها در DBMS می تونه به روش های مختلف خودش رو ترمیم بده که عبارتند از:
1)زیر تراکنش طرد شده رو دوباره اجرا کنه
2)نقص پدید آمده در روند اجرای زیر تراکنش را نادیده یگیره. در این صورت زیر تراکنش ، Non-vital transaction تلقی می شه.
3)زیر تراکنش دیگری را به عنوان زیر تراکنش Contigency transaction اجرا کنه.
4)خود تراکنش پدر نیز ROLLBACK شود.
در پایان می گم این ها به DBMS خاصی اشاره نداره و ممکنه MS SQL از یک روش و ORACLE از روش دیگه ای بهره ببره.
مرجع از کتاب CONN 2002
ممنون از جوابتون و اما یک سوال دیگه
حالا SQL Server به چه طریقی عمل میکنه و اگر این شیوه قابل تغییر هست ، از کجا میتونم تغییر بدم ؟
AminSobati
جمعه 09 فروردین 1387, 01:31 صبح
در SQL Server همیشه دستور Rollback Tran باعث Rollback شدن تا بیرونی ترین Transaction میشه. برای بدست آوردن Partial Rollback (یا Rollback کردن قسمتی از Transaction) میتونین از Save Tran استفاده کنین که به این ترتیب در دستور Rollback Tran باید نام Save Point رو ذکر کنید.
همیشه دستور Begin Tran یکی به مقدار trancount@@ اضافه میکنه، Commit Tran یکی ازش کم میکنه و Rollback Tran کلا صفر میکنه مگر اینکه از Save Point استفاده کرده باشید
Developer Programmer
جمعه 09 فروردین 1387, 11:52 صبح
bad_boy_2007@ (http://barnamenevis.org/forum/member.php?u=28601)
بهتره بعد از عبارت Begin Transaction ؛ اسم تراکنش رو هم درج کنی تا خوانایی و فهمش هم بیشتر باشه....
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.