انعطاف

ساخت وبلاگ

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

به عنوان نمونه ، ارائه دهنده SQL Server شامل یک استراتژی اجرای است که به طور خاص متناسب با SQL Server (از جمله SQL Azure) است. از انواع استثنائی که می توان دوباره می توان آن را آگاه کرد و پیش فرض های معقولی برای حداکثر قیام ، تأخیر بین ترمیم ها و غیره دارد.

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

یا در Startup. cs برای یک برنامه اصلی ASP. NET:

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

استراتژی اجرای سفارشی

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

استراتژی ها و معاملات اجرا

یک استراتژی اعدام که به طور خودکار در مورد خرابی ها دوباره قیام می کند ، باید بتواند هر عملیات را در یک بلوک آزمایشگاهی که با شکست انجام می شود ، انجام دهد. هنگامی که آزمایشگاه ها فعال می شوند ، هر عملیاتی که از طریق EF Core انجام می دهید ، به عملکرد بازپس گیری خود تبدیل می شود. یعنی هر پرس و جو و هر تماس با SaveChanges () در صورت بروز یک شکست گذرا ، به عنوان واحد مجدداً مورد استفاده قرار می گیرد.

با این حال ، اگر کد شما معامله ای را با استفاده از StartTransaction () شروع می کند ، شما گروه عملیات خود را تعریف می کنید که باید به عنوان یک واحد رفتار شوند و همه چیز در معامله نیاز به بازی مجدد دارد. اگر سعی در انجام این کار هنگام استفاده از یک استراتژی اعدام دارید ، استثنائی مانند موارد زیر دریافت خواهید کرد:

InvalidOperationException: استراتژی اجرای پیکربندی شده "SQLServerRetryingExecutionStrategy" از معاملات مبتنی بر کاربر پشتیبانی نمی کند. برای اجرای کلیه عملیات موجود در معامله به عنوان یک واحد بازپس گیری ، از استراتژی اعدام برگردانده شده توسط 'dbcontext. database. createexecutionstrategy () استفاده کنید.

راه حل این است که به صورت دستی از استراتژی اجرای با یک نماینده استفاده کنید و نمایانگر همه چیزهایی است که باید اجرا شود. در صورت بروز یک شکست گذرا ، استراتژی اجرای مجدداً نماینده را فراخوانی می کند.

این رویکرد همچنین می تواند با تراکنش های محیطی استفاده شود.

تراکنش مرتکب شکست و مسئله ناتوانی می شود

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

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

راه های مختلفی برای مقابله با این موضوع وجود دارد.

گزینه 1 - (تقریبا) هیچ کاری انجام ندهید

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

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

گزینه 2 - بازسازی وضعیت برنامه

  1. DbContext فعلی را کنار بگذارید.
  2. یک DbContext جدید ایجاد کنید و وضعیت برنامه خود را از پایگاه داده بازیابی کنید.
  3. به کاربر اطلاع دهید که ممکن است آخرین عملیات با موفقیت انجام نشده باشد.

گزینه 3 - تأیید وضعیت را اضافه کنید

برای اکثر عملیات هایی که وضعیت پایگاه داده را تغییر می دهند، می توان کدی را اضافه کرد که بررسی می کند که آیا موفق بوده است یا خیر. EF یک روش توسعه ای برای آسان تر کردن این کار ارائه می دهد - IEexecutionStrategy. ExecuteInTransaction.

این متد یک تراکنش را شروع و انجام می‌دهد و همچنین تابعی را در پارامتر verifySucceeded می‌پذیرد که هنگام وقوع یک خطای گذرا در حین انجام تراکنش فراخوانی می‌شود.

در اینجا SaveChanges با گزینه acceptAllChangesOnSuccess روی false فراخوانی می شود تا در صورت موفقیت SaveChanges، وضعیت موجودیت وبلاگ به Unchanged تغییر نکند. این اجازه می دهد تا در صورتی که commit با شکست مواجه شد و تراکنش به عقب برگشت، همان عملیات را دوباره امتحان کنید.

گزینه 4 - تراکنش را به صورت دستی پیگیری کنید

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

  1. یک جدول به پایگاه داده مورد استفاده برای ردیابی وضعیت تراکنش ها اضافه کنید.
  2. در ابتدای هر تراکنش یک ردیف در جدول قرار دهید.
  3. اگر اتصال در حین commit خراب شد، وجود ردیف مربوطه را در پایگاه داده بررسی کنید.
  4. اگر commit موفقیت آمیز بود، ردیف مربوطه را حذف کنید تا از رشد جدول جلوگیری کنید.

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

پلن سرمایه گذاری...
ما را در سایت پلن سرمایه گذاری دنبال می کنید

برچسب : نویسنده : لیلا اوتادی بازدید : 57 تاريخ : پنجشنبه 3 فروردين 1402 ساعت: 23:04