ورود

View Full Version : ذخیره در دو یا چند دیتا بیس در یک زمان و با استفاده از یک ترنزکشن



منصور بزرگمهر
چهارشنبه 24 شهریور 1389, 20:09 عصر
با سلام خدمت دوستان

من سئوال خود را با یک مثال ارائه می کنم.

فرض کنید در یک فروشگاه ما خریدی کرده ایم، و حال موقع پرداخت از کارت ATM استفاده می کنیم. در این حالت یک سری اطلاعات خرید ما در دیتا بیس فروشگاهمان ذخیره می شود (حساب حساب بانکی بدهکار، و حساب فروش اجناس بستانکار)، و متعاقب آن حساب مالی مشتری در دیتا بیس بانک کسر می شود (حساب بانکی ما بستانکار و اضافه به حساب ما، و حساب بانکی مشتری کسری و بدهکار دفتر روزنامه حسابداری می گردد)، و این دو عمل (ذخیره اطلاعات خرید در دیتا بیس فروشگاه و کسر پول در دیتا بیس بانک) در یک زمان صورت گرفته، و می بایستی هم در یک زمان صورت بگیرد، چرا که؛ اگر دیتا بیس ما اول ذخیره گردد (و یا بالعکس)، و دیتا بیس بانک ذخیره نگردد، ما اطلاعات فروش را وارد کرده ایم، ولی باعث درج اطلاعاتی در دیتا بیس بانک نشده ایم، و انتقال پول از حساب مشتری به حساب ما صورت نگرفته است، و پولی به حساب ما ریخته نشده است.
در واقع موضوع بسیار ساده است، حتماً اطلاعات دو دیتا بیس باید در یک زمان و با یک Transaction ذخیره گردد.

ولی اشکال کار اینجاست، که در کانکشن (استرینگ) ما، فقط یک دیتا بیس وجود دارد، و با این واقعیت، ما نمی توانیم، دو بانک متفاوت را (حتی توجه کنید ممکن است از دو خانواده متفاوت مثالاً یکی SQL Server و دومی Oracle باشد) با یک کانکشن (تک دیتا بیسه) ذخیره کنیم.

ولی عملاً برنامه های فروشگاه این کار را به راحتی انجام می دهند، و مشکلی در ذخیره دو بانک متفاوت با تضمین ذخیره/عدم ذخیره %100 در یک زمان را ندارند، و این چگونه ممکن است؟

کلاً می شود در دو یا چند بانک اطلاعاتی حتی با خانواده ها و فرمتهای مختلف در یک زمان و با یک ترانزکشن نوشت یا نه؟

MOJTABAATEFEH
چهارشنبه 24 شهریور 1389, 20:21 عصر
با سلام خدمت دوستان

من سئوال خود را با یک مثال ارائه می کنم.

فرض کنید در یک فروشگاه ما خریدی کرده ایم، و حال موقع پرداخت از کارت ATM استفاده می کنیم. در این حالت یک سری اطلاعات خرید ما در دیتا بیس فروشگاهمان ذخیره می شود (حساب حساب بانکی بدهکار، و حساب فروش اجناس بستانکار)، و متعاقب آن حساب مالی مشتری در دیتا بیس بانک کسر می شود (حساب بانکی ما بدهکار و اضافه به حساب ما، و حساب بانکی مشتری کسری و بستانکار دفتر روزنامه حسابداری می گردد)، و این دو عمل (ذخیره اطلاعات خرید در دیتا بیس فروشگاه و کسر پول در دیتا بیس بانک) در یک زمان صورت گرفته، و می بایستی هم در یک زمان صورت بگیرد، چرا که؛ اگر دیتا بیس ما اول ذخیره گردد (و یا بالعکس)، و دیتا بیس بانک ذخیره نگردد، ما اطلاعات فروش را وارد کرده ایم، ولی باعث درج اطلاعاتی در دیتا بیس بانک نشده ایم، و انتقال پول از حساب مشتری به حساب ما صورت نگرفته است، و پولی به حساب ما ریخته نشده است.
در واقع موضوع بسیار ساده است، حتماً اطلاعات دو دیتا بیس باید در یک زمان و با یک Transaction ذخیره گردد.

ولی اشکال کار اینجاست، که در کانکشن (استرینگ) ما، فقط دیتا بیس وجود دارد، و با این واقعیت، ما نمی توانیم، دو بانک متفاوت را (حتی توجه کنید ممکن است از دو خانواده متفاوت مثالاً یکی SQL Server و دومی Oracle باشد) با یک کانکشن (تک دیتا بیسه) ذخیره کنیم.

ولی عملاً برنامه های فروشگاه این کار را به راحتی انجام می دهند، و مشکلی در ذخیره دو بانک متفاوت با تضمین ذخیره/عدم ذخیره %100 در یک زمان را دارند، و این چگونه ممکن است؟

کلاً می شود در دو یا چند بانک اطلاعاتی حتی با خانواده ها و فرمتهای مختلف در یک زمان و با یک ترانزکشن نوشت یا نه؟

دوست عزیز در دو بانک که هر دو یک نوع دیتابیس مثلا SQL دارند مشکلی نیست کانکشن رو به MASTER متصل کن و در دستورات از USE استفاده کن به دیتابیس خودت و نام جدول ها رو هم به طور کامل به همراه نام دیتابیس و کاربر بنویس
برای مورد دوم هم به نظر من با یک کانکشن نمیشه و شما باید یا موقع استفاده Connection String رو مقدار دهی کنی که اتصال عوض بشه یا موقع طراحی از دو کانکشن استفاده کنی یا اینکه Runtime یک کانکشن بسازی


موفق باشید

بهزادصادقی
چهارشنبه 24 شهریور 1389, 20:57 عصر
منصور خان

در سیستم های نرم افزاری مدرن، برنامه هایی که در لایه هایی مثل لایه فروشگاهی کار می کنند به احتمال زیاد حتی یک connection string هم ندارند، چه برسد به جند تا.

شما حتما اسم فناوری web services را شنیده اید. اکثر سیستم های مدرن امروزی طراحی شان به این نحو است که برنامه client، که در مثال شما می شود برنامه هایی که روی سیستمهای فروشگاه در حال اجرا هستند، خود مستقیما نه با پایگاه داده ها صحبت می کنند و نه اصلا از وجود یک پایگاه داده ها اطلاع دارند. این برنامه ها در حقیقت تنها این را می دانند که در روی اینترنت (یا شبکه خصوصی شرکت) یک کامپیوتری یک جایی وجود دارد که در روی آن یک برنامه خاصی در حال اجرا می باشد. من نوعی، که برنامه فروشگاهی هستم، فقط می دانم چه طور خودم را به آن برنامه مادر برسانم، معرفی کنم و از وی تقاضای سرویس دهی کنم. رد و بدل اطلاعات ما نیز از طریق یک سری توافق ها تحت یک پروتوکل خاص انجام می شود. من هر وقت چیز خاصی لازم دارم از برنامه مادر آن را تقاضا می کنم. برنامه مادر هم هر وقت می خواهد من کار خاصی کنم آن را به من ابلاغ می کند. حال اینکه آن برنامه مادر با اطلاعاتی که من برایش می فرستم چه کار می کند و آنها را کجا ذخیره می کند و یا اینکه اطلاعاتی را که برای من می فرستد را از کجا گرفته، اینها دیگر ربطی به من ندارد و من هم هیچ چیزی در موردشان نمی دانم.

این معماری که نمونه بارز آن معماری های web service است به معماران سیستم این اجازه را می دهد که برای طراحی آن برنامه مادر (که اصطلاحا به آن عنوان یک لایه میانی یا Middleware داده می شود) دستشان باز باشد. آنها می توانند با پایگاه های داده مختلف کار کنند. ولی معمولا، در عمل، خیلی از این برنامه ها خود با برنامه های لایه میانی شرکت های دیگر کار می کنند. مثلا، لایه میانه سیستم فروشگاهی کارش مدیریت تراکنش برای فروشگاه است. ولی هر وقت لازم دارد که از حساب یک مشتری برداشت کند، با لایه میانی بانک طرف قرارداد فروشگاه تماس می گیرد و تراکنش را از آن طریق انجام می دهد. یعنی خود به طور مستقیم هیچ گونه دسترسی به پایگاه داده های بانک ندارد.

MOJTABAATEFEH
پنج شنبه 25 شهریور 1389, 11:11 صبح
منصور خان

در سیستم های نرم افزاری مدرن، برنامه هایی که در لایه هایی مثل لایه فروشگاهی کار می کنند به احتمال زیاد حتی یک connection string هم ندارند، چه برسد به جند تا.

شما حتما اسم فناوری web services را شنیده اید. اکثر سیستم های مدرن امروزی طراحی شان به این نحو است که برنامه client، که در مثال شما می شود برنامه هایی که روی سیستمهای فروشگاه در حال اجرا هستند، خود مستقیما نه با پایگاه داده ها صحبت می کنند و نه اصلا از وجود یک پایگاه داده ها اطلاع دارند. این برنامه ها در حقیقت تنها این را می دانند که در روی اینترنت (یا شبکه خصوصی شرکت) یک کامپیوتری یک جایی وجود دارد که در روی آن یک برنامه خاصی در حال اجرا می باشد. من نوعی، که برنامه فروشگاهی هستم، فقط می دانم چه طور خودم را به آن برنامه مادر برسانم، معرفی کنم و از وی تقاضای سرویس دهی کنم. رد و بدل اطلاعات ما نیز از طریق یک سری توافق ها تحت یک پروتوکل خاص انجام می شود. من هر وقت چیز خاصی لازم دارم از برنامه مادر آن را تقاضا می کنم. برنامه مادر هم هر وقت می خواهد من کار خاصی کنم آن را به من ابلاغ می کند. حال اینکه آن برنامه مادر با اطلاعاتی که من برایش می فرستم چه کار می کند و آنها را کجا ذخیره می کند و یا اینکه اطلاعاتی را که برای من می فرستد را از کجا گرفته، اینها دیگر ربطی به من ندارد و من هم هیچ چیزی در موردشان نمی دانم.

این معماری که نمونه بارز آن معماری های web service است به معماران سیستم این اجازه را می دهد که برای طراحی آن برنامه مادر (که اصطلاحا به آن عنوان یک لایه میانی یا Middleware داده می شود) دستشان باز باشد. آنها می توانند با پایگاه های داده مختلف کار کنند. ولی معمولا، در عمل، خیلی از این برنامه ها خود با برنامه های لایه میانی شرکت های دیگر کار می کنند. مثلا، لایه میانه سیستم فروشگاهی کارش مدیریت تراکنش برای فروشگاه است. ولی هر وقت لازم دارد که از حساب یک مشتری برداشت کند، با لایه میانی بانک طرف قرارداد فروشگاه تماس می گیرد و تراکنش را از آن طریق انجام می دهد. یعنی خود به طور مستقیم هیچ گونه دسترسی به پایگاه داده های بانک ندارد.

دوست عزیز آقای صادقی آیا منبع کاملی و ترجیحا فارسی در خصوص آموزش وب سرویس سراغ دارید؟

با تشکر

Asad.Safari
پنج شنبه 25 شهریور 1389, 11:36 صبح
در این حالت که از سرویس دیگران مانند پرداخت توسط POS استفاده می کنیم : باید اول سرویس RUN شود . در صورتی که انجام عملیات داخل سرویس مثلا پرداخت پول با موفقیت انجام شد , بیتی و یا پالسی به منظور اعلام با موفقیت بودن پروسه پرداخت بر می گردانند و ما هم به راحتی توسط این بیت خواهیم توانست که تصمیم بگیریم که آیا پروسه ثبت فاکتور و تغییر حساب مشتری شروع شود و یا نه . زمانیکه پرداخت انجام نشده است چگونه می توان فاکتور کشید ؟

در استفاده از سرویس دیگران نیازی به استفاده از Transaction نیست و فقط باید خروجی های سرویس مورد نظر را کنترل و مدیریت نماییم .

موفق باشید
--------------------

دوست عزیز آقای صادقی آیا منبع کاملی و ترجیحا فارسی در خصوص آموزش وب سرویس سراغ دارید؟

با تشکر

اگر از عاشقان دات نت هستید به دنبال WCF یا Windows Communication Foundation بگردید . و اگر از عشقان جاواو هستید هم به دنبال JEE بروید .

موفق باشید

منصور بزرگمهر
پنج شنبه 25 شهریور 1389, 17:50 عصر
با سلام دوباره خدمت دوستان. از راهنمائی هایتان بسیار متشکرم.

ابتدا با جواب دوم دوستمان MOJTABAATEFEH (http://barnamenevis.org/forum/member.php?u=47660) شروع می کنم.

اکر درست متوجه شده باشم، دستور ذخیره اطلاعات در دیتا بیس بانک (و ترانزکشنهای همراه آن)، و دستورات ذخیره اطلاعات در دیتا بیس خودمان (همراه با ترانزکشنهای مربوطه) در یک پردازش دسته ای (GO) قرار داده، و با صدور این دستور، کلیه اعمال لازمه با تضمین %100 صورت گرفته و یا عدم تضمین در صورت اختلال در کار، ولی مسئله ای که اینجا وجود دارد اینست که؛ من نمی دانم، این دستورات دسته ای، یک همچنین ویژگی دارد، که تضمین/عدم تضمین %100 اعمال را به ما بدهد یا خیر، و آیا هر اختلال در مابین دستورت باعث لغو کلیه دستورات ماقبل/مابعد و حتی آنهائیکه ترانزکشن دارند، می شود یا خیر، و آیا اصولاً پردازش دسته ای یعنی %100 انجام یا عدم انجام دستورات، و به چه معناست؟
مسئله دیگری که در این شکل حل مشکل وجود دارد، این است که، آیا بانک آدرس فیزیکی(شبکه) خود را به ما می دهد، که ما آنرا به SQL Server خودمان Attach کنیم یا نه، و پس از آن دیتا بیس بانک، ما را بعنوان یوزر مورد استفاده از جدول مربوطه معرفی می کند، و ما بدین ترتیب مشکل تعریف یوزرها و امنیت دیتا بیس بانک را داریم، و غیره...

ولی در جواب آقای بهزادصادقی (http://barnamenevis.org/forum/member.php?u=161058)

می توانید در مورد وب سرویسها بیشتر توضیح دهید. منابع انگلیسی/فارسی.
چراکه فروشگاهی که در مورد آن صحبت می کنم، زنجیره ای است، و خود از طریق شبکه به سرورهای مرکزی نصب (احتمالاً دامین سرور می باشند، چراکه برنامه عامل کلاینتها، یا این ماشینهای صندوق ویندوز XP می باشد) می باشند. ولی می توانید با زبانی ساده (فعلاً که ما از وب سرویسها چیزی نمی فهمیم) در مورد این سرویسها توضیح دهی، و ما را بیشتر با حل این مشکل آشنا کنی.

ولی جواب SIR_asad (http://barnamenevis.org/forum/member.php?u=5548)
دوباره همان مشکل اولیه ظهور می کند. اگر قرار باشد پالسی یا جواب فانکشنی True برگردد، و ما در خط بعد اطلاعات خود را ذخیره کنیم، در این خط مابین هر لحظه ممکن است اتفاقی بیفتد (عیب سخت افزاری هارد دیسک، مادر برد و ... یا نرم افزاری ویروس، ایراد برنامه عامل یا کاربردی، و ...)، و برنامه ما از کار بیفتد، و اطلاعات مربوط به ما ذخیره نگردد، و بدین ترتیب Integrity یا جامعیت سافت ویر ما (نه دیتا بیس داخلی ما، بلکه بهر ترتیب جامعیت نرم افزار ما) از بین می رود، و اصولاً فلسفه ترانزکشنها چیز دیگری می گوید، که شما در این جواب بدان توجه ای نکرده اید.

بهر حال از جواب کلیه دوستان بسیار متشکرم، و امیدوارم همه دوستان روی آن کار کرده، و به جوابی قاطع برسیم. چرا که این نوع ارتباطات بین بانک اطلاعاتی در دنیای پیشرفته بسیار زیاد و عادی است، و برای ما بعضاً سئوال. این را هم باید به آقای بهزادصادقی (http://barnamenevis.org/forum/member.php?u=161058) بگویم، که این نوع انتقال اطلاعات نیز بسیار قدیمی می باشد، حتی استفاده از ATM کارتها بصورت رایج و بعدها استفاده آن توسط نرم افزارهای فروشگاهها بر می گردد به اواخر دهه 80 میلادی، و ان موقع سرویسهای وب مانند امروز رایج نبوده، و آن زمان چگونه میتوانسته اند با جامعیت برنامه در دو دیتا بیس همزمان بنویسند، که چرا که من حتی امروز ماشینهای صندوق بعضاً می بینم که متعلق به برنامه عامل بسیار قدیمی، حتی تحت داس و زبان برنامه نویسی ممکن است ++C و نرم افزار بانک اطلاعاتی نمی دانم و کلاً سیستم بسیار قدیمی است، و حال چگونه آنها با بانکها ارتباط سالم داشته اند.

بهزادصادقی
پنج شنبه 25 شهریور 1389, 18:21 عصر
جناب مجتبی خان، جناب بزرگمهر:

متاسفانه منبع فارسی مناسبی نمی شناسم.

به انگلیسی صدها کتاب و شاید هزاران وب سایت در مورد وب سرویس ها وجود دارند که از زاویه های مختلفی به جنبه های مختلف آن نکاه می کنند. پیشنهاد می کنم در سایت amazon.com دنبال کتاب هایی که مورد توجه تان فرار می گیرند بگردیید و بعد ebook آنها را از اینترنت دانلود نمایید.

اگر اطلاعات ریشه ای لازم دارید، برای من خیلی کم هزینه تر خواهد بود که تلفنی خدمتتان باشم جون حجم مطالب زیاد است. می توانید پیغام خصوصی بدهید تا زمانی را برای صحبت کردن به صورت دست جمعی تعیین کنیم.

Asad.Safari
جمعه 26 شهریور 1389, 12:02 عصر
ولی جواب SIR_asad (http://barnamenevis.org/forum/member.php?u=5548)
دوباره همان مشکل اولیه ظهور می کند. اگر قرار باشد پالسی یا جواب فانکشنی True برگردد، و ما در خط بعد اطلاعات خود را ذخیره کنیم، در این خط مابین هر لحظه ممکن است اتفاقی بیفتد (عیب سخت افزاری هارد دیسک، مادر برد و ... یا نرم افزاری ویروس، ایراد برنامه عامل یا کاربردی، و ...)، و برنامه ما از کار بیفتد، و اطلاعات مربوط به ما ذخیره نگردد، و بدین ترتیب Integrity یا جامعیت سافت ویر ما (نه دیتا بیس داخلی ما، بلکه بهر ترتیب جامعیت نرم افزار ما) از بین می رود، و اصولاً فلسفه ترانزکشنها چیز دیگری می گوید، که شما در این جواب بدان توجه ای نکرده اید.


http://barnamenevis.org/forum/attachment.php?attachmentid=56529&stc=1&d=1361437019

این فایل را مشاهده کنید تا شاید مشکل حل شود .

موفق باشید