نحوه استفاده از معاملات در MongoDB

ساخت وبلاگ

معامله دنباله ای از عملیات پایگاه داده است که تنها در صورتی که هر عملیاتی در معامله به درستی انجام شود ، موفق خواهد شد. معاملات سالهاست که از ویژگی های مهم پایگاه داده های رابطه ای بوده است ، اما تا همین اواخر عمدتاً از پایگاه داده های اسناد گرا وجود ندارد. ماهیت پایگاه داده های مستند محور-جایی که یک سند واحد می تواند یک ساختار قوی و تو در تو باشد ، حاوی اسناد و آرایه های تعبیه شده و به جای فقط مقادیر ساده باشد-داده های مرتبط را در یک سند واحد ذخیره می کند. به این ترتیب ، اصلاح چندین اسناد به عنوان بخشی از یک عملیات منطقی واحد اغلب غیر ضروری است و نیاز به معاملات در بسیاری از برنامه ها را محدود می کند.

با این حال ، برنامه هایی وجود دارد که دسترسی و اصلاح چندین اسناد در یک عملیات واحد با یکپارچگی تضمین شده حتی با بانکهای اطلاعاتی مستند مورد نیاز است. MongoDB معاملات اسید چندتایی را در نسخه 4. 0 موتور پایگاه داده به منظور تأمین نیازهای چنین مواردی معرفی کرد. در این مقاله ، شما بررسی خواهید کرد که معاملات ، خصوصیات اسیدی یک معامله و نحوه استفاده از معاملات در MongoDB چیست.

پیش نیازها

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

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

اولین قدم این راهنما نحوه انجام این کار را تشریح می کند ، بنابراین برای تکمیل این آموزش ، فقط به موارد زیر نیاز خواهید داشت:

  • یک سرور با یک کاربر معمولی و غیر ریشه با امتیازات سودو و فایروال پیکربندی شده با UFW. این آموزش با استفاده از سرور در حال اجرا Ubuntu 20. 04 تأیید شد و می توانید سرور خود را با دنبال کردن این آموزش اولیه تنظیم سرور برای اوبونتو 20. 04 آماده کنید.
  • MongoDB روی سرور شما نصب شده است. برای تنظیم این کار ، آموزش ما در مورد نحوه نصب MongoDB در اوبونتو 20. 04 را دنبال کنید.

درک معاملات اسیدی

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

برای نشان دادن اینکه چرا معاملات برای سیستم های پایگاه داده بسیار مهم هستند ، تصور کنید که در یک بانک کار می کنید و باید پول را از مشتری A به مشتری منتقل کنید. همان زمان.

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

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

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

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

جداسازی این ایده است که معاملات جداگانه و همزمان در حال اجرا از یکدیگر جدا می شوند و هیچ یک از نتایج دیگران را تحت تأثیر قرار نمی دهند. اگر دو معاملات به طور همزمان اجرا شوند ، قانون انزوا تضمین می کند که نتیجه نهایی همان است که اگر آنها یکی پس از دیگری اجرا شده اند.

دوام تضمین می کند که به محض موفقیت معامله ، مشتری می تواند مطمئن شود که داده ها به درستی ادامه یافته است. حتی چیزی مانند خرابی سخت افزار یا وقفه برق ، معامله را باطل نمی کند.

معاملات در MongoDB با این اصول اسید مطابقت دارد و در مواردی که لازم است چندین اسناد را در یک حرکت واحد تغییر دهید ، قابل اعتماد است.

مرحله 1 - تبدیل نمونه MongoDB مستقل خود به یک مجموعه ماکت

همانطور که قبلاً ذکر شد ، به دلیل نحوه اجرای آنها در MongoDB ، معاملات فقط در پایگاه داده هایی که به عنوان بخشی از یک خوشه بزرگتر اجرا می شوند ، قابل انجام است. این خوشه می تواند یک خوشه پایگاه داده Sharded یا یک مجموعه ماکت باشد.

اگر قبلاً مجموعه ای از ماکت یا خوشه های Sharded را تنظیم کرده اید که می توانید برای انجام معاملات در حال استفاده از آن استفاده کنید ، می توانید از این مرحله پرش کنید و از آن خوشه در مرحله 2 استفاده کنید. اگر اینگونه نباشد ، این مرحله به تشریح نحوه تبدیل یک نمونه MongoDB مستقل به یک واحدمجموعه ماکت Node.

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

اگر می خواهید در مورد تکثیر در MongoDB و پیامدهای امنیتی که در آن وجود دارد ، اطلاعات بیشتری کسب کنید ، ما به شدت شما را تشویق می کنیم تا آموزش خود را در مورد نحوه پیکربندی یک ماکت MongoDB در Ubuntu 20. 04 بررسی کنید.

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

بخشی را پیدا کنید که #Replication را می خواند: به پایین این پرونده:

با حذف علامت پوند ( #) این خط را از بین ببرید. سپس یک دستورالعمل repsetName را در زیر این خط اضافه کنید و به دنبال آن نامی که MongoDB برای شناسایی مجموعه ماکت استفاده می کند:

در این مثال ، مقدار دستورالعمل repsetName "RS0" است. شما می توانید هر نامی را که دوست دارید در اینجا ارائه دهید ، اما استفاده از یک نام توصیفی می تواند مفید باشد.

توجه: هنگامی که تکثیر فعال می شود ، MongoDB همچنین به شما نیاز دارد تا برخی از وسایل تأیید اعتبار را غیر از تأیید اعتبار رمز عبور ، مانند تأیید اعتبار KeyFile یا تنظیم گواهینامه های X. 509 پیکربندی کنید. اگر نحوه تأمین امنیت MongoDB را در آموزش Ubuntu 20. 04 دنبال کرده اید و تأیید اعتبار را در نمونه MongoDB خود فعال کرده اید ، فقط تأیید اعتبار رمز عبور را فعال خواهید کرد.

به جای تنظیم اقدامات امنیتی پیشرفته تر ، برای اهداف این آموزش ، غیرفعال کردن بلوک امنیتی در پرونده mongod. conf شما محتاطانه خواهد بود. این کار را با اظهار نظر در هر خط در بلوک امنیتی با یک علامت پوند انجام دهید:

تا زمانی که شما فقط قصد دارید از این بانک اطلاعاتی برای انجام معاملات یا اهداف دیگر استفاده کنید ، این یک خطر امنیتی را به وجود نمی آورد. با این حال ، اگر قصد دارید از این نمونه MongoDB برای ذخیره هرگونه داده حساس در آینده استفاده کنید ، حتماً این خطوط را برای احراز هویت مجدداً مورد استفاده قرار ندهید.

این تنها تغییراتی است که شما باید در این پرونده ایجاد کنید ، بنابراین می توانید آن را ذخیره و بسته کنید. اگر از Nano برای ویرایش پرونده استفاده کرده اید ، می توانید با فشار دادن Ctrl + X ، Y این کار را انجام دهید و سپس وارد کنید.

پس از آن ، سرویس Mongod را مجدداً راه اندازی کنید تا تغییرات جدید پیکربندی را اجرا کنید:

پس از راه اندازی مجدد سرویس ، پوسته MongoDB را باز کنید تا به نمونه MongoDB که روی سرور خود اجرا می شود ، وصل شوید:

از سریع MongoDB ، روش Rs. Initiate () زیر را اجرا کنید. با این کار نمونه مستقل MongoDB شما به یک مجموعه ماکت تک گره ای تبدیل می شود که می توانید برای آزمایش استفاده کنید:

اگر این روش "OK" را برگرداند: 1 در خروجی آن ، به این معنی است که مجموعه ماکت با موفقیت شروع شده است:

با فرض این مورد ، سریع پوسته MongoDB شما تغییر می کند تا نشان دهد که نمونه ای که پوسته به آن متصل شده است ، اکنون عضو مجموعه ماکت RS0 است:

توجه داشته باشید که این مثال سریع نشان می دهد که این نمونه MongoDB عضو ثانویه مجموعه ماکت است. این انتظار می رود ، زیرا معمولاً بین زمانی که یک مجموعه ماکت آغاز می شود و زمان ارتقاء یکی از اعضای آن برای عضویت اصلی ، شکاف وجود دارد.

اگر قرار بود یک فرمان را اجرا کنید یا حتی بعد از چند لحظه انتظار Enter را فشار دهید ، سریعاً به روز می شود تا منعکس شود که شما به عضو اصلی مجموعه ماکت متصل هستید:

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

مرحله 2 - تهیه داده های نمونه

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

اگر قدم قبلی را رد کردید زیرا یک خوشه mongoDB یا مجموعه ماکت موجود در آن داشتید ، به هر گره متصل شوید که می توانید داده ها را برای آن بنویسید:

توجه: در یک اتصال تازه ، پوسته MongoDB به طور پیش فرض به طور خودکار به پایگاه داده تست وصل می شود. با اطمینان می توانید از این پایگاه داده برای آزمایش با MongoDB و MongoDB Shell استفاده کنید.

از طرف دیگر ، شما همچنین می توانید به پایگاه داده دیگری بروید تا تمام دستورات مثال را که در این آموزش ارائه شده است اجرا کنید. برای تغییر به پایگاه داده دیگر ، دستور استفاده را اجرا کنید که به دنبال آن نام پایگاه داده خود را انجام دهید:

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

این سند حاوی اطلاعات زیر است:

  • نام: نام شهر.
  • کشور: کشوری که شهر در آن واقع شده است.
  • قاره: قاره ای که در آن شهر واقع شده است.
  • جمعیت: جمعیت این شهر ، در میلیون ها نفر.

روش درج زیر () را اجرا کنید ، که به طور همزمان مجموعه ای به نام شهرها ایجاد می کند و سه سند را در آن وارد می کند:

خروجی شامل لیستی از شناسه های شیء است که به اشیاء تازه درج شده اختصاص داده شده است:

می توانید تأیید کنید که اسناد به درستی با اجرای روش FIND () بدون استدلال درج شده اند ، که هر سند را در مجموعه شهرها بازیابی می کند:

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

MongoDB تأیید خواهد کرد که این فهرست با موفقیت ایجاد شده است:

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

مرحله 3 - ایجاد اولین معامله کامل خود

این مرحله نحوه ایجاد معامله متشکل از یک عملیات واحد را بیان می کند که از مرحله قبل یک سند جدید را در مجموعه نمونه وارد می کند.

با باز کردن دو جلسه جداگانه MongoDB پوسته شروع کنید. یکی از آنها برای اجرای دستورات در معامله استفاده می شود و دیگری به شما امکان می دهد تا در نقاط مختلف زمان برای سایر کاربران پایگاه داده در خارج از معامله در دسترس باشد.

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

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

در این مرحله ، هر دو جلسه پوسته باید در صورت پرس و جو از مجموعه شهرها ، سه شهر را که قبلاً درج کرده اید لیست کنید. تأیید کنید که با صدور پرس و جو Find () در هر دو جلسه پوسته ، با شروع اول:

سپس همان پرس و جو را در جلسه دوم پوسته خود اجرا کنید:

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

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

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

این آموزش به جای تنظیم یک برنامه خارجی ، مفاهیم و مراحل فردی مورد نیاز برای کار با یک معامله را مستقیماً در پوسته MongoDB با نحو JavaScript ساده تشریح می کند.

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

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

این دستور یک متغیر جلسه ایجاد می کند که شیء جلسه را ذخیره می کند. هر بار که در مثالهای زیر به موضوع جلسه مراجعه می کنید ، به جلسه ای که تازه شروع کرده اید مراجعه می کنید.

با استفاده از این شیء جلسه ، می توانید معامله را با فراخوانی روش StartTransaction به شرح زیر شروع کنید:

توجه داشته باشید که این روش در متغیر جلسه و نه DB فراخوانی شده است ، همانطور که دستورات در مرحله قبل انجام شد. روش StartTransaction () دو گزینه را می پذیرد: ReadConce و WritEconce. تنظیمات WritEconce می تواند چند گزینه را بپذیرد ، اما این مثال فقط گزینه W را شامل می شود ، که درخواست می کند که این خوشه هنگام پذیرش عملیات نوشتن معامله در تعداد مشخصی از گره ها در خوشه پذیرفته شود. به جای یک شماره واحد ، این مثال مشخص می کند که وقتی اکثر گره ها عملیات نوشتن را تصدیق می کنند ، معامله فقط با موفقیت ذخیره می شود.

بگویید که شما یک معامله را شروع می کنید ، اما بعد از انجام این کار ، کاربر دیگری سندی را به مجموعه ای که در یک گره دیگر در خوشه استفاده می کنید اضافه می کند. آیا معامله شما باید این داده های جدید را بخواند یا فقط داده های نوشته شده بر روی گره ای که در آن معامله شروع شده است؟تنظیم سطح ReadConce به شما امکان می دهد تا هنگام انجام معامله ، چه داده هایی را معامله کنید. تنظیم آن در عکس فوری به این معنی است که معامله تصویری از داده هایی را که توسط اکثر گره های این خوشه انجام شده است ، می خواند.

توجه داشته باشید که تنظیم سطح خواندن Conce معامله شما را ملزم می کند تا WritEconce را به اکثریت تنظیم کنید. این مقادیر برای نگرانی های خواندن و نوشتن به طور پیش فرض ایمن است که در بیشتر موارد دنبال می شود. آنها ضمانت های قابل اعتماد از ماندگاری داده ها را ارائه می دهند ، مگر اینکه شما نیازهای خاصی در مورد عملکرد داشته باشید و تصدیق می کنید که در مجموعه ماکت می نویسد. شما می توانید در مورد نگرانی های مختلف نوشتن و خواندن اطلاعات بیشتر که MongoDB برای استفاده در معاملات در مستندات رسمی MongoDB ارائه می دهد ، اطلاعات بیشتری کسب کنید.

در صورت اجرای صحیح ، روش StartTransaction هیچ خروجی را بازگرداند. اگر این روش موفقیت آمیز باشد ، شما در یک معامله در حال اجرا خواهید بود و می توانید اجرای اظهاراتی را که به بخشی از معامله تبدیل می شوند ، شروع کنید.

هشدار: به طور پیش فرض ، MongoDB به طور خودکار هر معامله ای را که بیش از 60 ثانیه انجام می شود ، سقط می کند. دلیل این امر این است که معاملات به گونه ای طراحی نشده اند که به صورت تعاملی در پوسته MongoDB ساخته شوند بلکه در برنامه های دنیای واقعی استفاده می شوند.

به همین دلیل ، اگر هر دستور را در مدت زمان 60 ثانیه اجرا نکنید ، ممکن است در حین پیروی از این آموزش با خطاهای غیر منتظره روبرو شوید. اگر با خطایی مانند موارد زیر روبرو شوید ، این بدان معنی است که MongoDB معامله را سقط کرده است زیرا محدودیت زمانی از آن فراتر رفته است:

اگر این اتفاق بیفتد ، شما باید معامله را با اجرای روش aborttransaction () فسخ کنید ، مانند این:

سپس باید معامله را با همان روش StartTransaction () که قبلاً اجرا کرده اید ، مجدداً تنظیم کنید:

پس از آن ، از ابتدا باید هر بیانیه را در معامله دوباره اجرا کنید. با توجه به این نکته ، ممکن است برای شما مفید باشد که ابتدا بقیه این مرحله را بخوانید و سپس دستورات را در مدت زمان 60 ثانیه اجرا کنید ، پس از درک بهتر مفاهیم موجود.

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

در یک هدف مشابه ، هنگام کار در یک معامله در حال اجرا ، می توان متغیر دیگری را ایجاد کرد که نمایانگر مجموعه ای است که می خواهید با آنها در متن جلسه کار کنید. عملیات زیر با بازگرداندن مجموعه شهرها از پایگاه داده آزمون ، متغیری به نام شهرها ایجاد می کند. با این حال ، به جای اینکه این موضوع را مستقیماً از شیء DB بکشید ، آن را به شیء جلسه ارجاع می دهد تا اطمینان حاصل کند که این متغیر مجموعه شهرها را در متن جلسه اجرا نشان می دهد:

از این زمان تا زمان انجام معامله ، می توانید از متغیر شهرها استفاده کنید ، دقیقاً مانند استفاده از DB. Cities برای مراجعه به مجموعه شهرها. این متغیر تازه تعیین شده تضمین می کند که شما در یک جلسه اظهارات را اجرا می کنید و به همین ترتیب در معامله آغاز شده نیز انجام می شود.

این کار را با بررسی اینکه می توان از شیء برای یافتن اسناد از مجموعه استفاده کرد ، آزمایش کنید:

این دستور همان لیست اسناد را مانند گذشته باز می گرداند از آنجا که داده ها هنوز تغییر نکرده اند:

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

MongoDB پیام موفقیت را برمی گرداند:

اگر قرار بود مجدداً شهرها را اجرا کنید.

با این حال ، اگر db. cities. find () را در دومین نمونه پوسته mongoDB خود اجرا کنید ، سند نماینده نیویورک غایب خواهد بود:

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

برای انجام معامله و ذخیره سند درج شده به طور دائم در پایگاه داده ، روش CommitTransaction را روی شیء جلسه اجرا کنید:

همانطور که با StartTransaction ، این دستور در صورت موفقیت هیچ خروجی نمی دهد.

اکنون ، اسناد را از مجموعه شهرها در هر دو پوسته MongoDB لیست کنید. در جلسه در حال اجرا با پرس و جو از متغیر شهرها شروع کنید:

سپس مجموعه شهرها را در پوسته دوم که خارج از معامله است ، پرس و جو کنید:

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

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

مرحله 4 - سقط یک معامله

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

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

در اولین پوسته MongoDB ، جلسه را شروع کرده و دوباره به متغیر جلسه اختصاص دهید:

سپس معامله را شروع کنید:

باز هم ، این روش در صورت موفقیت ، هیچ خروجی را بر نمی گرداند. اگر موفقیت آمیز باشد ، در یک معامله در حال اجرا خواهید بود.

شما مجدداً به مجموعه شهرها در متن جلسه نیاز خواهید داشت. شما می توانید این کار را دوباره با ایجاد یک متغیر شهرها انجام دهید تا مجموعه شهرها را در داخل جلسه نشان دهد:

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

اکنون که معامله آغاز شده است ، یک سند جدید دیگر را به عنوان بخشی از معامله در حال اجرا در این مجموعه وارد کنید. سند موجود در این مثال نمایانگر Buenos Aires خواهد بود. از روش INSERTONE استفاده کنید ، اما آن را در متغیر شهرها اجرا کنید تا اطمینان حاصل شود که در جلسه اجرا می شود:

MongoDB پیام موفقیت را برمی گرداند:

بعد ، شهرها را اجرا کنید.

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

با این حال ، اگر قرار بود از مجموعه شهرها در نمونه دوم MongoDB خود ، که در معامله کار نمی کند ، پرس و جو کنید ، لیست برگشتی حاوی سند Buenos Aires نیست زیرا معامله انجام نشده است:

بگویید اشتباه کرده اید و دیگر نمی خواهید معامله را انجام دهید. درعوض ، شما می خواهید هرگونه اظهاراتی را که به عنوان بخشی از این جلسه اجرا کرده اید ، لغو کنید و معامله را به طور کلی سقط کنید. برای انجام این کار ، روش aborttransaction () را اجرا کنید:

روش aborttransaction () به MongoDB می گوید که تمام تغییرات معرفی شده در معامله را کنار بگذارد و بانک اطلاعاتی را به حالت قبلی بازگرداند. همانطور که با StartTransaction و CommitTransaction ، این دستور در صورت موفقیت هیچ خروجی نمی دهد.

پس از سقط جنین با موفقیت ، اسناد را از مجموعه شهرها در هر دو پوسته MongoDB ذکر کنید. ابتدا عملیات زیر را در جلسه اجرا اجرا کنید:

سپس پرس و جو زیر را در نمونه دوم پوسته خود که در خارج از جلسه اجرا می شود اجرا کنید:

Buenos Aires از هر دو لیست غایب است. سقط جنین پس از درج سند ، اما قبل از انجام معامله ، مانند قرار دادن هرگز اتفاق نیفتاده است.

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

مرحله 5 - سقط جنین به دلیل خطاها

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

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

در اولین پوسته MongoDB ، جلسه را شروع کرده و آن را به متغیر جلسه اختصاص دهید:

سپس معامله را شروع کنید:

متغیر شهرها را دوباره ایجاد کنید:

پس از آن ، یک سند جدید دیگر را به عنوان بخشی از معامله در حال اجرا در این مجموعه وارد کنید. این مثال سندی را به نمایندگی از اوزاکا ، ژاپن وارد می کند:

MongoDB پیام موفقیت را برمی گرداند:

شهر تازه درج شده بلافاصله از داخل معامله قابل مشاهده خواهد بود:

با این حال ، سند اوزاکا از آنجا که خارج از معامله است در پوسته دوم قابل مشاهده نخواهد بود:

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

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

MongoDB پیام خطا را برمی گرداند و اشاره می کند که این عملیات محدودیت منحصر به فرد را نقض می کند:

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

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

MongoDB اجازه این کار را نمی دهد و در عوض خطایی پرتاب می کند:

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

می توانید این کار را با اجرای پرس و جو Find () هر دو در هر دو پوسته تأیید کنید. در پوسته اول ، پرس و جو را در چارچوب جلسه اجرا کنید:

سپس در پوسته دوم ، در خارج از جلسه ، پیدا کردن () را در برابر db. cities اجرا کنید:

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

نتیجه

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

با استفاده از این مهارت های جدید ، می توانید در برنامه هایی که ممکن است مورد نیاز آنها باشد ، از اسید تضمین معاملات چند مستند استفاده کنید. با این حال ، به یاد داشته باشید که MongoDB یک بانک اطلاعاتی مستند است. در بسیاری از سناریوها ، خود مدل اسناد و همچنین طراحی دقیق طرحواره می تواند نیاز به کار با معاملات چند مستند را کاهش دهد.

این آموزش فقط یک مقدمه مختصر برای معاملات در MongoDB ارائه داد. ما شما را تشویق می کنیم تا در مورد اسناد رسمی رسمی MongoDB برای کسب اطلاعات بیشتر در مورد نحوه کار معاملات ، مطالعه کنید.

اگر از این آموزش و جامعه وسیع ما لذت بردید ، در نظر بگیرید که محصولات دیجیتالی ما را بررسی کنید که می تواند به شما در دستیابی به اهداف توسعه نیز کمک کند.

سری آموزش: نحوه مدیریت داده ها با MongoDB

MongoDB یک سیستم مدیریت پایگاه داده NOSQL مستند (DBMS) است. بر خلاف DBMS های رابطه ای سنتی ، که داده ها را در جداول متشکل از ردیف ها و ستون ها ذخیره می کنند ، MongoDB داده ها را در ساختارهای JSON مانند ذخیره می کند که به آن اسناد گفته می شود.

این مجموعه مروری بر ویژگی های MongoDB و نحوه استفاده از آنها برای مدیریت و تعامل با داده های خود ارائه می دهد.

فارکس پرشین...
ما را در سایت فارکس پرشین دنبال می کنید

برچسب : نویسنده : دلیله نمازی بازدید : 49 تاريخ : پنجشنبه 18 خرداد 1402 ساعت: 0:48