تالار گفتمان مانشت
سوالی در رابطه با نحوه ی انجام تراکنش - نسخه‌ی قابل چاپ

سوالی در رابطه با نحوه ی انجام تراکنش - fereshte88 - 19 مهر ۱۳۹۳ ۰۸:۳۷ ب.ظ

سلام. من یک سوال دارم. ممنون میشم اگه کسی راهنماییم کنه. سوالم اینه:
<می خوایم یک مبلغی رو از یک حساب به حساب دیگه واریز کنیم،اگر در هر زمان سیستم دچار خرابی شد نتیجه ی حاصل درست باشه> این روالش به چه صورته؟ و دوم اینکه:
در صورتی که هر کدوم از حساب ها توی بانک مجزایی در یک سیستم شبکه با DBMS های متفاوت باشه؛ روال این یکی به چه صورته؟

RE: سوالی در رابطه با نحوه ی انجام تراکنش - x86 - 19 مهر ۱۳۹۳ ۰۸:۵۲ ب.ظ

(۱۹ مهر ۱۳۹۳ ۰۸:۳۷ ب.ظ)fereshte88 نوشته شده توسط:  <می خوایم یک مبلغی رو از یک حساب به حساب دیگه واریز کنیم،اگر در هر زمان سیستم دچار خرابی شد نتیجه ی حاصل درست باشه> این روالش به چه صورته؟ و دوم اینکه:

همونطور که حدس زدید این کار توسط تراکنش انجام می شه. یکی از ویژگی های تراکنش این هست یا انجام بشه یا کلا انجام نشه تا سیستم در حالت سازگار باقی بمونه. و اما اینکه تراکنش به چه صورت انجام میشه. فرض کنید که تراکنش ما قراره کار زیر رو انجام بده:
A=A-100
B=B+100
روش های مختلفی برای مدیریت همروندی وجود داره که ما اینجا فرض می کنیم داده های A و B قفل شدن. تراکنش به این صورت هست که هر کاری رو که انجام میده در یک فایل لاگ زمان، شماره ی تراکنش، و کار انجام شده رو توی اون فایل لاگ ثبت میکنه. وقتی که تراکنش به کلی انجام شد شماره ی تراکنش به همراه دستور commit در فایل لاگ ثبت میشه. فرض کنید که دستور A=A-100 اجرا شد ولی بعدش سیستم دچار خرابی شد. حالا وقتی مجددا سیستم بالا اومد، DBMS به سراغ فایل لاگ میره اگه آخرین دستور ما commit بود (فرض می کنیم فقط یه تراکنش هست) پس همه چیز خوب پیش رفته ولی اگه commit نبود دستور ها رو یکی یکی عکسش رو انجام میده (اینجا A=A+100 میشه) تا زمانی که به دستور begin برسه.

برای کسب اطلاعات بیشتر به فصل ۱۴ (Transaction) کتاب پایگاه داده های جناب سیلبرشاتس رجوع کنید.

RE: سوالی در رابطه با نحوه ی انجام تراکنش - fereshte88 - 19 مهر ۱۳۹۳ ۰۹:۰۰ ب.ظ

(۱۹ مهر ۱۳۹۳ ۰۸:۵۲ ب.ظ)x86 نوشته شده توسط:  
(19 مهر ۱۳۹۳ ۰۸:۳۷ ب.ظ)fereshte88 نوشته شده توسط:  <می خوایم یک مبلغی رو از یک حساب به حساب دیگه واریز کنیم،اگر در هر زمان سیستم دچار خرابی شد نتیجه ی حاصل درست باشه> این روالش به چه صورته؟ و دوم اینکه:

همونطور که حدس زدید این کار توسط تراکنش انجام می شه. یکی از ویژگی های تراکنش این هست یا انجام بشه یا کلا انجام نشه تا سیستم در حالت سازگار باقی بمونه. و اما اینکه تراکنش به چه صورت انجام میشه. فرض کنید که تراکنش ما قراره کار زیر رو انجام بده:
A=A-100
B=B+100
روش های مختلفی برای مدیریت همروندی وجود داره که ما اینجا فرض می کنیم داده های A و B قفل شدن. تراکنش به این صورت هست که هر کاری رو که انجام میده در یک فایل لاگ زمان، شماره ی تراکنش، و کار انجام شده رو توی اون فایل لاگ ثبت میکنه. وقتی که تراکنش به کلی انجام شد شماره ی تراکنش به همراه دستور commit در فایل لاگ ثبت میشه. فرض کنید که دستور A=A-100 اجرا شد ولی بعدش سیستم دچار خرابی شد. حالا وقتی مجددا سیستم بالا اومد، DBMS به سراغ فایل لاگ میره اگه آخرین دستور ما commit بود (فرض می کنیم فقط یه تراکنش هست) پس همه چیز خوب پیش رفته ولی اگه commit نبود دستور ها رو یکی یکی عکسش رو انجام میده (اینجا A=A+100 میشه) تا زمانی که به دستور begin برسه.

برای کسب اطلاعات بیشتر به فصل ۱۴ (Transaction) کتاب پایگاه داده های جناب سیلبرشاتس رجوع کنید.

خیلی ممنون از جوابتون. اگر DBMS ها متفاوت باشند چطوره؟

RE: سوالی در رابطه با نحوه ی انجام تراکنش - x86 - 19 مهر ۱۳۹۳ ۰۹:۱۳ ب.ظ

(۱۹ مهر ۱۳۹۳ ۰۹:۰۰ ب.ظ)fereshte88 نوشته شده توسط:  خیلی ممنون از جوابتون. اگر DBMS ها متفاوت باشند چطوره؟

سوالتون رو میشه با نحوه ی پردازش تراکنش در سیستم های توزیع شده پاسخ داد. در اونجا یک میان افزاری وجود خواهد داشت که دستورات را به یه استانداردی تبدیل کرده و در دو DBMS اجرا خواهد کرد. اما این کار به چه صورت انجام میشه؟ فرض می کنیم که یه Coordinator داریم (که معمولا این کار رو انجام میدن) دقیقا همین فرایندی که در بالا توضیح دادم در Coordinator صورت میگیره و اون دستورات را به تمامی گره ها ارسال میکنه و تنها در صورتی تراکنش commit میشه که تک تک گره ها دستور commit را صادر و Coordinator اون ها رو دریافت کرده باشه. البته روش هایی وجود داره که اگه تعدادی از گره ها دستور را Commit نکردن باز هم سیستم به کارش ادمه بده.

قابل ذکر هست که تو این جور مواقع معمولا دو نوع تراکنش انجام میشه:
۱- تراکنش های محلی: که هر DBMS برای خودش انجام میده بدون اینکه Coordinator یا در واقع کنترلر از اون خبر دار باشه
۲- تراکنش های جهانی (Global): که این نوع تراکنش ها تحت نظر Coordinator انجام میشه. که چیزی که شما میخوایید از این نوع هست.

برای اطلاعات بیشتر میتونید به فصل ۱۹ (Distributed Databases) جناب سیلبرشاتس بخش ۱۹/۳ با عنوان Distributed Transactions و بخش ۱۹/۸ با عنوان Heterogeneous Distributed Databases که دقیقا به ناهمگنیِ DBMS ها اشاره میکنه مراجعه کنید.

RE: سوالی در رابطه با نحوه ی انجام تراکنش - fereshte88 - 19 مهر ۱۳۹۳ ۰۹:۴۳ ب.ظ

خیلی ممنون از جوابتون. اگر DBMS ها متفاوت باشند چطوره؟
[/quote]

سوالتون رو میشه با نحوه ی پردازش تراکنش در سیستم های توزیع شده پاسخ داد. در اونجا یک میان افزاری وجود خواهد داشت که دستورات را به یه استانداردی تبدیل کرده و در دو DBMS اجرا خواهد کرد. اما این کار به چه صورت انجام میشه؟ فرض می کنیم که یه Coordinator داریم (که معمولا این کار رو انجام میدن) دقیقا همین فرایندی که در بالا توضیح دادم در Coordinator صورت میگیره و اون دستورات را به تمامی گره ها ارسال میکنه و تنها در صورتی تراکنش commit میشه که تک تک گره ها دستور commit را صادر و Coordinator اون ها رو دریافت کرده باشه. البته روش هایی وجود داره که اگه تعدادی از گره ها دستور را Commit نکردن باز هم سیستم به کارش ادمه بده.

قابل ذکر هست که تو این جور مواقع معمولا دو نوع تراکنش انجام میشه:

خیلی خیلی ممنون