معاملات و مدیریت اتصال

ساخت وبلاگ

تغییر در نسخه 1. 4: مدیریت معاملات جلسه اصلاح شده است تا واضح تر و استفاده آسان تر باشد. به طور خاص ، اکنون دارای عملکرد "autobegin" است ، به این معنی که ممکن است بدون استفاده از حالت "AutomMit" میراث شروع به کنترل می کند.

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

این معامله "مجازی" در صورت لزوم به طور خودکار ایجاد می شود ، یا می تواند با استفاده از روش Session. Begin () شروع شود. تا آنجا که ممکن است یک درجه عالی ، استفاده از مدیر متن پایتون هم در سطح ایجاد اشیاء جلسه و هم برای حفظ دامنه SessionTransaction پشتیبانی می شود.

در زیر ، فرض کنید ما با یک جلسه شروع می کنیم:

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

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

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

این جلسه دارای یک روش Session. Close () است. اگر جلسه در معامله ای آغاز شود که هنوز مرتکب نشده یا به عقب برگشته است ، این روش آن معامله را لغو می کند (یعنی بازگشت) ، و همچنین تمام اشیاء موجود در حالت شیء جلسه را بیرون می کشد. اگر جلسه به گونه ای استفاده شود که یک تماس به جلسه.commit () یا Session. rollback () تضمین نشده باشد (به عنوان مثال در یک مدیر متن یا مشابه) ، از روش نزدیک برای اطمینان از همه منابع استفاده می شودمنتشر شد:

سرانجام ، فرآیند ساخت و ساز / نزدیک می تواند از طریق Context Manager اجرا شود. این بهترین راه برای اطمینان از اینکه دامنه استفاده از شیء جلسه در یک بلوک ثابت قرار گرفته است. اول از طریق سازنده جلسه نشان داده شده است:

به همین ترتیب ، SessionMaker می تواند به همان روش استفاده شود:

SessionMaker خود شامل یک روش SessionMaker. Begin () است که اجازه می دهد هر دو عمل به یکباره انجام شود:

با استفاده از SavePoint¶

معاملات SavePoint ، در صورت پشتیبانی از موتور زیرین ، ممکن است با استفاده از جلسه. begin_nested () ترسیم شود.

هر بار جلسه. begin_nested () نامیده می شود ، یک دستور جدید "شروع SavePoint" در محدوده معامله پایگاه داده فعلی (با شروع یکی از قبل در حال انجام) به پایگاه داده منتشر می شود و یک شی از نوع SessionTransaction بازگردانده می شود ، کهیک دسته از این SavePoint را نشان می دهد. هنگامی که روش .commit () روی این شیء نامیده می شود ، "Release SavePoint" به پایگاه داده منتشر می شود ، و در عوض روش . rollback () نامیده می شود ، "Rollback to SavePoint" منتشر می شود. معامله پایگاه داده محصور در حال انجام است.

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

هنگامی که مدیر زمینه توسط Session. begin_nested () به پایان رسید ، آن را "SavePoint" می کند ، که شامل رفتار معمول شستشوی همه وضعیت در انتظار است. هنگامی که خطایی مطرح شد ، SavePoint به عقب چرخانده می شود و وضعیت جلسه محلی به اشیاء تغییر یافته منقضی می شود.

این الگوی برای موقعیت هایی مانند استفاده از postgresql و گرفتن یک integrityerror برای تشخیص ردیف های تکراری ایده آل است. PostgreSQL معمولاً هنگام افزایش چنین خطایی ، کل ترانسپت را قطع می کند ، اما هنگام استفاده از SavePoint ، معامله بیرونی حفظ می شود. در مثال زیر لیستی از داده ها به پایگاه داده ادامه می یابد ، با این که سابقه گاه به گاه "کپی اولیه" رد شد ، بدون اینکه کل عمل را برگرداند:

هنگامی که session. begin_nested () خوانده می شود ، جلسه اول همه در حال حاضر در حال انتظار وضعیت به پایگاه داده است. این بدون قید و شرط ، صرف نظر از مقدار جلسه ، بدون قید و شرط رخ می دهد. دلیل این رفتار به گونه ای است که وقتی یک بازپرداخت در این معامله تو در تو رخ می دهد ، جلسه ممکن است هر حالت حافظه را که در محدوده SavePoint ایجاد شده است منقضی شود ، در حالی که اطمینان حاصل می کند که وقتی آن اشیاء منقضی شده تازه می شوند ، وضعیت آن وضعیتنمودار شیء قبل از شروع SavePoint برای بارگیری مجدد از پایگاه داده در دسترس خواهد بود.

در نسخه های مدرن Sqlalchemy ، هنگامی که یک SavePoint آغاز شده توسط Session. begin_nested () به عقب برگردد ، حالت شیء در حافظه که از زمان ایجاد SavePoint اصلاح شده است منقضی شده است ، اما وضعیت شیء دیگر که از زمان شروع SavePoint تغییر نکرده است. بشراین به گونه ای است که عملیات بعدی می تواند بدون نیاز به تازه کردن آن از پایگاه داده ، از داده های غیر تحت تأثیر استفاده کند.

سطح جلسه در مقابل سطح موتور کنترل معاملات معامله

اتصال در Core و _session. Session در ORM دارای معنایی معادل معامله معادل ، هم در سطح SessionMaker در مقابل موتور و همچنین جلسه در مقابل اتصال است. بخش های زیر این سناریوها را بر اساس طرح زیر شرح می دهد:

همانطور که می روید مرتکب شوید

هر دو روش و اتصال ویژگی اتصال.commit () و connection. rollback (). این روش ها با استفاده از عملکرد SQLalchemy 2. 0 به سبک ، در همه موارد بر بیرونی ترین معامله تأثیر می گذارد. برای جلسه ، فرض بر این است که جلسه.autobegin به مقدار پیش فرض واقعی خود باقی مانده است.

یک بار شروع کنید

هر دو Sessionmaker و Engine دارای یک موتور هستند. Begin () روش که هر دو یک شیء جدید را تهیه می کنند که به ترتیب برای اجرای اظهارات SQL (جلسه و اتصال) به ترتیب) و سپس یک مدیر زمینه را برگردانید که زمینه شروع/تعهد/بازگشت را برای آن حفظ کندآن شی

معامله تو در تو در تو

هنگام استفاده از SavePoint از طریق Session. begin_nested () یا Connection. Begin_Nested () ، از شیء معامله برگشت یافته باید برای ارتکاب یا بازگرداندن SavePoint استفاده شود. فراخوانی با روشهای جلسه () یا اتصال.commit () همیشه بیرونی ترین معامله را مرتکب می شود. این یک رفتار خاص Sqlalchemy 2. 0 است که از سری 1. x معکوس می شود.

صریح آغاز

این جلسه شامل رفتار "autobegin" است ، به این معنی که به محض شروع عملیات ، تضمین می کند که یک جلسه SessionTransaction برای پیگیری عملیات مداوم وجود دارد. این معامله هنگامی که Session.commit () فراخوانی می شود تکمیل می شود.

غالباً مطلوب است ، به ویژه در ادغام چارچوب ، کنترل نقطه ای که عمل "شروع" در آن رخ می دهد. برای متناسب با این ، جلسه از یک استراتژی "autobegin" استفاده می کند ، به گونه ای که ممکن است روش جلسه. begin () مستقیماً برای جلسه ای که قبلاً معامله ای آغاز نکرده است فراخوانی شود:

الگوی فوق با استفاده از یک مدیر زمینه به صورت احمقانه تر فراخوانی می شود:

روش Session. Begin () و فرآیند "autobegin" جلسه از همان دنباله مراحل برای شروع معامله استفاده می کنند. این شامل این است که رویداد SessionEvents. After_Transaction_Create () هنگام وقوع فراخوانی می شود. این قلاب توسط چارچوب ها به منظور ادغام فرآیندهای معامله خود با جلسه ORM استفاده می شود.

تعهد دو فاز را فعال می کند

برای پشتیبان هایی که از عملکرد دو فاز پشتیبانی می کنند (در حال حاضر MySQL و PostgreSQL) ، می توان به جلسه دستور داد که از معناشناسی متعهد دو فاز استفاده کند. این کار ارتکاب معاملات را در پایگاه داده ها هماهنگ می کند تا معامله یا در کلیه بانکهای اطلاعاتی انجام شود یا به عقب برگردد. شما همچنین می توانید Session. Prepare () جلسه تعامل با معاملات که توسط Sqlalchemy مدیریت نشده است. برای استفاده از معاملات دو فاز ، پرچم Twophase = True را در جلسه تنظیم کنید:

تنظیم سطح جداسازی معامله / DBAPI AutoCommit¶

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

DBAPIS که از سطح انزوا پشتیبانی می کند ، معمولاً از مفهوم "اتمامیت" واقعی نیز پشتیبانی می کند ، به این معنی که اتصال DBAPI به خودی خود در یک حالت اتوماسیون غیر تعویض قرار می گیرد. این معمولاً بدان معنی است که رفتار معمولی DBAPI در انتشار "شروع" به پایگاه داده به طور خودکار دیگر رخ نمی دهد ، اما ممکن است شامل دستورالعمل های دیگری نیز باشد. هنگام استفاده از این حالت ، DBAPI تحت هیچ شرایطی از معامله استفاده نمی کند. روشهای sqlalchemy مانند . begin () ، .commit () و . rollback () سکوت می کنند.

لهجه های Sqlalchemy از حالت های جداسازی قابل حل بر اساس موتور یا اتصال پشتیبانی می کنند ، با استفاده از پرچم ها در هر دو سطح CREATE_ENGINE () و همچنین در سطح اتصال.

هنگام استفاده از جلسه ORM ، به عنوان نمای موتورها و اتصالات عمل می کند ، اما به طور مستقیم انزوای معامله را در معرض نمایش نمی گذارد. بنابراین برای تأثیرگذاری بر سطح جداسازی معامله ، باید در صورت لزوم بر روی موتور یا اتصال عمل کنیم.

تنظیم سطح جداسازی معاملات از جمله AutomMit DBAPI - حتماً بررسی کنید که چگونه سطح انزوا در سطح شیء اتصال Sqlalchemy نیز کار می کند.

تنظیم انزوا برای یک جلسه ساز / موتور گسترده

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

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

در بالا ، هر دو "Eng" و "AutoCommit_Engine" همان گویش و استخر اتصال را دارند. با این حال ، حالت "AutoCommit" هنگام دستیابی به AutoCommit_Engine به اتصالات تنظیم می شود. دو جلسه سازنده "Transactional_Session" و "AutoCommit_Session" را به این ترتیب می دانند و سپس این خصوصیات را هنگام کار با اتصالات پایگاه داده به ارث می برند.

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

تعیین انزوا برای جلسات فردی

هنگامی که ما یک جلسه جدید را انجام می دهیم ، یا با استفاده از سازنده به طور مستقیم یا هنگامی که از تماس قابل تماس توسط یک جلسه ساز استفاده می کنیم ، می توانیم استدلال Bind را مستقیماً منتقل کنیم و بر روی اتصال از قبل موجود غلبه کنیم. به عنوان مثال می توانیم جلسه خود را از یک SessionMaker پیش فرض ایجاد کنیم و یک موتور را برای AutoCommit بگذریم:

برای موردی که جلسه یا جلسه ساز با چندین "اتصال" پیکربندی شده باشد ، می توانیم آرگومان Binds را به طور کامل مشخص کنیم ، یا اگر می خواهیم فقط اتصال های خاص را جایگزین کنیم ، می توانیم از Session. Bind_Mapper () یا Session. bind_table استفاده کنیم.() مواد و روش ها:

تعیین انزوا برای معاملات فردی

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

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

در بالا ، ما ابتدا یک جلسه را با استفاده از سازنده یا یک جلسه ساز تهیه می کنیم. سپس ما صریحاً شروع یک معامله در سطح پایگاه داده را با فراخوانی Session. Connection () تنظیم کردیم ، که گزینه های اجرای را ارائه می دهد که قبل از شروع معامله در سطح پایگاه داده به اتصال منتقل می شود. معامله با این سطح انزوا انتخاب شده پیش می رود. پس از اتمام معامله ، قبل از بازگشت اتصال به استخر اتصال ، سطح انزوا در اتصال به پیش فرض آن تنظیم می شود.

از روش Session. Begin () نیز ممکن است برای شروع معامله سطح جلسه استفاده شود. تماس با جلسه. اتصال () متعاقب آن تماس ممکن است برای تنظیم سطح انزوا در هر ارتباط هر ارتباط استفاده شود:

ردیابی وضعیت معامله با رویدادها

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

پیوستن به یک جلسه به یک معامله خارجی (مانند سوئیت های آزمون)

اگر از ارتباطی استفاده شود که در حال حاضر در یک وضعیت معامله قرار دارد (یعنی معامله ای ایجاد شده است) ، می توان جلسه ای را برای شرکت در آن معامله انجام داد و فقط با الزام کردن جلسه به آن ارتباط. دلیل معمول برای این کار یک مجموعه آزمایشی است که به ORM Code اجازه می دهد تا با یک جلسه آزادانه کار کند ، از جمله امکان تماس با Session.commit () ، جایی که پس از آن کل تعامل پایگاه داده به عقب برگردانده می شود.

تغییر در نسخه 1. 4: این بخش نسخه جدیدی از دستور العمل "به معامله خارجی" را معرفی می کند که به همان اندازه برای موتورها و جلسات سبک به سبک 2. 0 و 1. x خوب کار خواهد کرد. دستور العمل در اینجا از نسخه های قبلی مانند 1. 3 نیز به کار برای موتورها و جلسات 1. x ادامه خواهد داد.

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

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

فلجاژدها و طرح های تصویر کیمیاگر ایجاد شده و سخاوتمندانه توسط روتم یااری اهدا شده است.

با استفاده از Sphinx 5. 3. 0 ایجاد شده است. مستندات آخرین تولید: جمعه 23 دسامبر 2022 10:46:15 صبح

بهترین بروکر فارکس...
ما را در سایت بهترین بروکر فارکس دنبال می کنید

برچسب : نویسنده : داریوش اسدزاده بازدید : 204 تاريخ : سه شنبه 1 فروردين 1402 ساعت: 15:18