فقط EF6 به بعد - ویژگی ها ، API ها و غیره که در این صفحه مورد بحث قرار گرفته است در چارچوب Entity 6. معرفی شده است. اگر از نسخه قبلی استفاده می کنید ، برخی یا تمام اطلاعات اعمال نمی شود.
در این سند استفاده از معاملات در EF6 از جمله پیشرفتهایی که از EF5 اضافه کرده ایم برای کار با معاملات آسان است.
آنچه EF به طور پیش فرض انجام می دهد
در تمام نسخه های Framework Entity ، هر زمان که SaveChanges () را برای وارد کردن ، به روزرسانی یا حذف پایگاه داده اجرا کنید ، چارچوب آن عملیات را در یک معامله می پیچد. این معامله فقط به اندازه کافی طولانی طول می کشد تا عملیات را انجام دهد و سپس تکمیل شود. هنگامی که چنین عملیاتی دیگری را انجام می دهید ، معامله جدیدی آغاز می شود.
با شروع با پایگاه داده EF6. ExecutesqlCommand () به طور پیش فرض در صورت عدم حضور ، دستور را در یک معامله می پیچید. اضافه بار این روش وجود دارد که به شما امکان می دهد در صورت تمایل این رفتار را نادیده بگیرید. همچنین در اجرای EF6 روشهای ذخیره شده موجود در مدل از طریق API مانند ObjectContext. executeFunction () همین کار را می کند (به جز اینکه رفتار پیش فرض در حال حاضر نمی تواند نادیده گرفته شود).
در هر صورت ، سطح جداسازی معامله هر سطح جداسازی است که ارائه دهنده پایگاه داده تنظیم پیش فرض خود را در نظر می گیرد. به طور پیش فرض ، به عنوان مثال ، در SQL Server این مرتکب خوانده شده است.
Framework Entity در یک معامله نمایش داده شد.
این عملکرد پیش فرض برای بسیاری از کاربران مناسب است و در این صورت نیازی به انجام کاری متفاوت در EF6 نیست. فقط کد را مثل همیشه بنویسید.
با این حال برخی از کاربران نیاز به کنترل بیشتری بر معاملات خود دارند - این در بخش های بعدی پوشش داده شده است.
چگونه API ها کار می کنند
قبل از EF6 Entity Framework بر باز کردن اتصال پایگاه داده خود اصرار داشت (اگر به اتصالی که از قبل باز شده بود ، استثنائی را برطرف می کرد). از آنجا که یک معامله فقط می تواند با یک اتصال باز آغاز شود ، این بدان معنی است که تنها راهی که یک کاربر می تواند چندین عملیات را به یک معامله بپیوندد استفاده از TransactionScope یا استفاده از ویژگی ObjectContext. Connection و شروع به فراخوانی Open () و StartTransaction ()به طور مستقیم در شیء موجودیت connection. علاوه بر این ، تماس های API که با پایگاه داده تماس گرفته اند ، اگر معامله ای را در اتصال پایگاه داده زیربنایی به تنهایی انجام داده اید ، شکست می خورد.
محدودیت فقط پذیرش اتصالات بسته در چارچوب Entity 6. حذف شد. برای جزئیات بیشتر ، به مدیریت اتصال مراجعه کنید.
شروع با EF6 چارچوب اکنون ارائه می دهد:
- Database. BeginTransaction(): یک روش ساده تر برای کاربر برای شروع و تکمیل تراکنش ها در یک DbContext موجود - به چندین عملیات اجازه می دهد تا در یک تراکنش ترکیب شوند و از این رو یا همه تعهد شده باشند یا همه به عنوان یک بازگردانده شوند. همچنین به کاربر اجازه می دهد تا سطح ایزوله تراکنش را به راحتی مشخص کند.
- Database. UseTransaction(): که به DbContext اجازه می دهد تا از تراکنشی استفاده کند که خارج از Entity Framework شروع شده است.
ترکیب چندین عملیات در یک تراکنش در یک زمینه
Database. BeginTransaction () دارای دو نادیده گرفتن است یکی که یک IsolationLevel صریح می گیرد و دیگری که هیچ آرگومان نمی گیرد و از IsolationLevel پیش فرض ارائه دهنده پایگاه داده استفاده می کند. هر دو لغو یک شیء DbContextTransaction را برمی گردانند که متدهای Commit() و Rollback() را ارائه می کند که commit و rollback را در تراکنش فروشگاه زیربنایی انجام می دهند.
منظور از DbContextTransaction این است که پس از تعهد یا بازگرداندن آن حذف شود. یکی از راه های آسان برای انجام این کار، نحو استفاده از (…) است که به طور خودکار Dispose() را پس از تکمیل بلوک استفاده فراخوانی می کند:
شروع یک تراکنش مستلزم باز بودن اتصال فروشگاه اصلی است. بنابراین فراخوانی Database. BeginTransaction () باعث باز شدن اتصال می شود اگر قبلاً باز نشده باشد. اگر DbContextTransaction اتصال را باز کند، با فراخوانی Dispose() آن را می بندد.
انتقال تراکنش موجود به متن
گاهی اوقات شما تراکنشی را می خواهید که حتی از نظر دامنه وسیع تر باشد و شامل عملیات در پایگاه داده یکسان اما خارج از EF باشد. برای انجام این کار، باید اتصال را باز کنید و تراکنش را خودتان شروع کنید و سپس به EF بگویید a) از اتصال پایگاه داده ای که قبلاً باز شده است استفاده کند و ب) از تراکنش موجود در آن اتصال استفاده کند.
برای انجام این کار باید سازنده ای را در کلاس context خود تعریف و استفاده کنید که از یکی از سازنده های DbContext که i) پارامتر اتصال موجود و ii) بولی contextOwnsConnection را می گیرد به ارث می برد.
هنگام فراخوانی در این سناریو، پرچم contextOwnsConnection باید روی false تنظیم شود. این مهم است زیرا به Entity Framework اطلاع می دهد که وقتی اتصال با آن انجام شد نباید آن را ببندد (به عنوان مثال، خط 4 را در زیر ببینید):
علاوه بر این ، شما باید خودتان معامله را انجام دهید (از جمله اگر می خواهید از تنظیم پیش فرض جلوگیری کنید) و به Framework Entity اطلاع دهید که یک معامله موجود از قبل در اتصال شروع شده است (خط 33 را در زیر مشاهده کنید).
سپس شما می توانید عملیات پایگاه داده را مستقیماً در خود SQLConnection یا در DBContext اجرا کنید. کلیه این عملیات در یک معامله انجام می شود. شما مسئولیت ارتکاب یا عقب نشینی معامله و تماس با Dishing () را بر روی آن و همچنین بسته شدن و دفع اتصال پایگاه داده بر عهده دارید. مثلا:
پاک کردن معامله
برای پاک کردن دانش Entity Framework از معامله فعلی می توانید NULL را به Database. Utransaction () منتقل کنید. چارچوب Entity هنگام انجام این کار ، نه معامله موجود را مرتکب و بازپرداخت نمی کند ، بنابراین با احتیاط استفاده کنید و فقط اگر مطمئن باشید این کاری است که می خواهید انجام دهید.
خطاهای موجود در usetransaction
اگر معامله ای را هنگام عبور از Database. Usetransaction () مشاهده خواهید کرد:
- چارچوب موجودیت در حال حاضر یک معامله موجود دارد
- Framework Entity در حال حاضر در یک Transactionscope فعالیت می کند
- شیء اتصال در معامله تصویب شده تهی است. یعنی معامله با اتصال همراه نیست - معمولاً این نشانه ای است که معامله قبلاً انجام شده است
- شیء اتصال در معامله تصویب شده با اتصال چارچوب Entity مطابقت ندارد.
استفاده از معاملات با سایر ویژگی ها
در این بخش نحوه تعامل معاملات فوق با:
- انعطاف
- روشهای ناهمزمان
- معاملات TransactionScope
انعطاف
ویژگی جدید انعطاف پذیری اتصال با معاملات مبتنی بر کاربر کار نمی کند. برای جزئیات بیشتر ، به استراتژی های اجرای مجدد مراجعه کنید.
برنامه نویسی ناهمزمان
رویکرد ذکر شده در بخش های قبلی نیازی به گزینه یا تنظیمات دیگری برای کار با پرس و جو ناهمزمان و صرفه جویی در روش ها ندارد. اما توجه داشته باشید که بسته به آنچه در روشهای ناهمزمان انجام می دهید ، این ممکن است منجر به معاملات طولانی مدت شود-که به نوبه خود می تواند باعث ایجاد بن بست یا مسدود شود که برای عملکرد برنامه کلی بد است.
معاملات TransactionScope
قبل از EF6 روش پیشنهادی برای ارائه معاملات دامنه بزرگتر استفاده از یک شیء TransactionScope بود:
چارچوب SQLConnection و Entity هم از معامله TransactionScope Amerient استفاده می کند و از این رو با هم متعهد می شوند.
با شروع . NET 4. 5. 1 TransactionScope به روز شده است تا از طریق استفاده از شمارش TransactionScopeasyncflowOption با روشهای ناهمزمان نیز کار کند:
هنوز هم محدودیت هایی در رویکرد TransactionScope وجود دارد:
- برای کار با روشهای ناهمزمان به . NET 4. 5. 1 یا بیشتر نیاز دارد.
- در سناریوهای ابری قابل استفاده نیست ، مگر اینکه مطمئن باشید که یک و فقط یک اتصال دارید (سناریوهای ابر از معاملات توزیع شده پشتیبانی نمی کنند).
- نمی توان آن را با رویکرد Database. Usetransaction () از بخش های قبلی ترکیب کرد.
- اگر DDL را صادر کنید و معاملات توزیع شده را از طریق سرویس MSDTC فعال نکرده اید ، استثنائاتی خواهد بود.
مزایای رویکرد TransactionScope:
- اگر بیش از یک اتصال به یک پایگاه داده داده شده ایجاد کنید یا اتصال به یک پایگاه داده را با اتصال به یک پایگاه داده متفاوت در همان معامله ، به طور خودکار یک معامله محلی را به یک معامله توزیع شده ارتقا دهید (توجه داشته باشید: شما باید سرویس MSDTC را پیکربندی کنیدبرای انجام معاملات توزیع شده برای این کار).
- سهولت برنامه نویسی. اگر ترجیح می دهید معامله محیط باشد و به طور ضمنی در پس زمینه انجام شود نه صریحاً تحت کنترل شما ، رویکرد TransactionScope ممکن است برای شما مناسب تر باشد.
به طور خلاصه ، با API های جدید Database. begintransaction () و Database. Utransaction () در بالا ، رویکرد TransactionScope دیگر برای اکثر کاربران ضروری نیست. اگر به استفاده از TransactionScope ادامه می دهید ، از محدودیت های فوق آگاه باشید. توصیه می کنیم در صورت امکان از رویکرد ذکر شده در بخش های قبلی استفاده کنید.
پلتفرمهای تجاری...
ما را در سایت پلتفرمهای تجاری دنبال می کنید
برچسب :
نویسنده : حامد بهداد
بازدید : 55
تاريخ : يکشنبه
6 فروردين
1402 ساعت: 11:45