موتور فرآیند قطعه ای از کد جاوا منفعل است که در موضوع مشتری کار می کند. به عنوان مثال ، اگر یک برنامه وب دارید که به کاربران امکان می دهد یک نمونه جدید فرآیند را شروع کنند و یک کاربر روی دکمه مربوطه کلیک می کند ، برخی از موضوعات مربوط به استخر HTTP-Thread سرور برنامه از روش API RuntimeService. StartProcessInstanceByKey () استفاده می کنند. ورود به موتور فرآیند و شروع نمونه جدید فرآیند. ما این را "وام گرفتن موضوع مشتری" می نامیم.
در هر ماشه خارجی (به عنوان مثال ، یک فرآیند را شروع کنید ، یک کار را انجام دهید ، سیگنال اجرای آن را انجام دهید) ، زمان اجرای موتور در این فرآیند پیشرفت می کند تا زمانی که در هر مسیر فعال اجرا به حالت های انتظار برسد. حالت انتظار یک کار است که بعداً انجام می شود ، به این معنی که موتور اجرای فعلی را به پایگاه داده ادامه می دهد و منتظر است که دوباره شروع شود. به عنوان مثال در مورد کار کاربر ، ماشه خارجی در تکمیل کار باعث می شود زمان اجرا بیت بعدی روند را اجرا کند تا اینکه دوباره به حالت های انتظار برسد (یا نمونه به پایان می رسد). برخلاف وظایف کاربر ، یک رویداد تایمر در خارج از کشور ایجاد نمی شود. درعوض آن توسط یک ماشه داخلی ادامه می یابد. به همین دلیل موتور همچنین به یک مؤلفه فعال ، مجری شغل نیاز دارد که قادر به بدست آوردن مشاغل ثبت شده و پردازش آنها به صورت غیر همزمان است.
در ایالات متحده منتظر بمانید
ما در مورد ایالت های انتظار به عنوان مرزهای معامله صحبت کردیم که در آن حالت فرآیند در پایگاه داده ذخیره می شود ، موضوع به مشتری باز می گردد و معامله انجام می شود. عناصر BPMN زیر همیشه در حال انتظار هستند:
به خاطر داشته باشید که ادامه های ناهمزمان می توانند مرزهای معامله را به سایر کارها نیز اضافه کنند.
مرزهای معامله
انتقال از یک وضعیت پایدار به حالت پایدار دیگر همیشه بخشی از یک معامله واحد است ، به این معنی که به عنوان یک کل موفق می شود یا به هر نوع استثنائی که در هنگام اجرای آن رخ می دهد ، بازگردانده می شود. این در مثال زیر نشان داده شده است:
ما بخشی از یک فرآیند BPMN را با یک کار کاربر ، یک کار سرویس و یک رویداد تایمر مشاهده می کنیم. رویداد تایمر حالت انتظار بعدی را نشان می دهد. انجام کار کاربر و اعتبارسنجی آدرس بخشی از همان واحد کار است ، بنابراین باید به صورت اتمی موفق شود یا شکست بخورد. این بدان معناست که اگر وظیفه سرویس یک استثنا را پرتاب کند ، می خواهیم معامله فعلی را به عقب برگردانیم ، به طوری که اجرای آن به وظیفه کاربر بازگردد و کار کاربر هنوز در پایگاه داده حضور داشته باشد. این همچنین رفتار پیش فرض موتور فرآیند است.
در 1 ، یک برنامه برنامه یا مشتری کار را انجام می دهد. در همان موضوع ، زمان اجرای موتور اکنون وظیفه سرویس را اجرا می کند و پیشرفت می کند تا اینکه در رویداد تایمر به حالت انتظار برسد (2). سپس کنترل را به تماس گیرنده (3) که به طور بالقوه انجام معامله را انجام می دهد (اگر توسط موتور شروع شده باشد) باز می گردد.
ادامه های ناهمزمان
چرا ادامه های ناهمزمان؟
در بعضی موارد رفتار همزمان مورد نظر نیست. بعضی اوقات داشتن کنترل سفارشی بر مرزهای معامله در یک فرآیند مفید است. شایع ترین انگیزه ، الزام به دامنه واحدهای منطقی کار است. قطعه فرآیند زیر را در نظر بگیرید:
ما در حال انجام کار کاربر هستیم ، فاکتور ایجاد می کنیم و سپس آن فاکتور را به مشتری ارسال می کنیم. می توان استدلال کرد که نسل فاکتور بخشی از همان واحد کار نیست: ما نمی خواهیم در صورت عدم موفقیت در فاکتور ، اتمام usertask را به عقب برگردانیم. در حالت ایده آل ، موتور فرآیند وظیفه کاربر (1) را تکمیل می کند ، معامله را مرتکب شده و کنترل را به برنامه فراخوانی (2) انجام می دهد. در یک موضوع پس زمینه (3) ، فاکتور را تولید می کند. این رفتار دقیقی است که توسط ادامه های ناهمزمان ارائه می شود: آنها به ما این امکان را می دهند که مرزهای معامله را در این فرآیند محدود کنیم.
تنظیمات ناهمزمان را پیکربندی کنید
ادامه های ناهمزمان را می توان قبل و بعد از یک فعالیت پیکربندی کرد. علاوه بر این ، یک نمونه فرآیند ممکن است پیکربندی شود تا به صورت ناهمزمان شروع شود.
یک ادامه ناهمزمان قبل از فعال شدن با استفاده از Camunda: AsyncBefore ویژگی برنامه افزودنی:
ادامه کار ناهمزمان پس از یک فعالیت با استفاده از camunda: ویژگی پسوند asyncafter:
فوری ناهمزمان یک نمونه فرآیند با استفاده از Camunda: AsyncBefore Extension در یک رویداد شروع فرآیند فعال می شود. در لحظه ، نمونه فرایند در پایگاه داده ایجاد و ادامه خواهد یافت ، اما اجرای آن به تعویق می افتد. همچنین ، شنوندگان اعدام همزمان مورد استفاده قرار نمی گیرند. این می تواند در موقعیت های مختلف مانند خوشه های ناهمگن مفید باشد ، هنگامی که کلاس شنونده اعدام در گره ای که روند را فوری می کند در دسترس نیست.
استمرار ناهمزمان فعالیتهای چند منظوره
یک فعالیت چند منظوره می تواند برای ادامه فعالیت های ناهمزمان مانند سایر فعالیت ها پیکربندی شود. اعلام ادامه ناهمزمان از یک فعالیت چند منظوره باعث می شود بدن چند منظوره ناهمزمان باشد ، به این معنی که این روند به صورت ناهمزمان پیش از ایجاد نمونه های آن فعالیت یا بعد از پایان همه موارد ادامه می یابد.
علاوه بر این ، فعالیت داخلی همچنین می تواند برای ادامه ناهمزمان با استفاده از Camunda: Asyncbefore و Camunda: ویژگی های پسوند Asyncafter در عنصر چند ویژگی چند ویژگی:
اعلام ادامه ناهمزمان فعالیت درونی باعث می شود هر نمونه از فعالیت چند منظوره ناهمزمان باشد. در مثال بالا ، تمام موارد فعالیت موازی چند منظوره ایجاد می شود اما اجرای آنها به تعویق می افتد. این می تواند برای کنترل بیشتر بر مرزهای معامله فعالیت چند منظوره یا فعال کردن موازی سازی واقعی در صورت وجود یک فعالیت موازی چند منظوره مفید باشد.
ادامه های ناهمزمان را درک کنید
برای درک چگونگی عملکرد ناهمزمان ، ابتدا باید درک کنیم که چگونه یک فعالیت اجرا می شود:
تصویر فوق نشان می دهد که چگونه یک فعالیت منظم که توسط یک جریان دنباله وارد و چپ می شود ، اجرا می شود:
- شنوندگان "Take" در جریان توالی وارد فعالیت می شوند.
- شنوندگان "شروع" از خود فعالیت استفاده می شوند.
- رفتار فعالیت انجام می شود: رفتار واقعی به نوع فعالیت بستگی دارد: در صورت انجام وظیفه خدمات ، رفتار شامل فراخوانی کد نمایندگی است ، در صورت انجام کار کاربر ، رفتار شامل ایجاد یک نمونه کار در آن استلیست کار و غیره
- شنوندگان "پایان" از این فعالیت استفاده می شوند.
- شنوندگان "گرفتن" جریان توالی خروجی فراخوانی می شوند.
ادامه های ناهمزمان اجازه می دهد تا نقاط شکست بین اجرای جریان دنباله و اجرای فعالیت:
تصویر فوق نشان می دهد که انواع مختلفی از ادامه های ناهمزمان جریان اجرای را می شکنند:
- ادامه یک شرکت ناهمزمان قبل از فعالیت ، جریان اعدام را بین فراخوان جریان توالی وارد کننده شنوندگان و اجرای شنوندگان شروع فعالیت می کند.
- ادامه یک شرکت ناهمزمان پس از یک فعالیت ، جریان اعدام را بین دعوت شنوندگان نهایی فعالیت و شنوندگان توالی خروجی می کند.
ادامه های ناهمزمان به طور مستقیم به مرزهای معامله مربوط می شود: قرار دادن یک ادامه ناهمزمان قبل یا بعد از یک فعالیت ، مرز معامله را قبل یا بعد از فعالیت ایجاد می کند:
علاوه بر این ، ادامه های ناهمزمان همیشه توسط مجری شغل اجرا می شوند.
بازگشت به استثنا
ما می خواهیم تأکید کنیم که در صورت وجود یک استثناء غیر کنترل شده ، معامله فعلی به عقب برگردد و نمونه روند در آخرین حالت انتظار (Save Point) است. تصویر زیر آن را تجسم می کند.
اگر یک استثنا هنگام فراخوانی StartProcessInstanceByKey رخ دهد ، نمونه روند به هیچ وجه در پایگاه داده ذخیره نمی شود.
استدلال برای این طرح
راه حل طراحی شده فوق به طور معمول منجر به بحث می شود ، زیرا افراد انتظار دارند که موتور فرآیند در صورتی که این کار باعث یک استثناء شود ، متوقف شود. همچنین ، سایر مجموعه های BPM اغلب هر کار را به عنوان حالت انتظار اجرا می کنند. با این حال ، این رویکرد مزایای چندانی دارد:
- در موارد آزمایشی شما وضعیت دقیق موتور را بعد از تماس روش می دانید ، که باعث می شود ادعاهای مربوط به وضعیت فرآیند یا نتایج تماس خدمات آسان شود.
- در کد تولید نیز همین درست است ؛به شما امکان می دهد در صورت لزوم از منطق هماهنگ استفاده کنید ، به عنوان مثال زیرا می خواهید یک تجربه همزمان کاربر را در قسمت جلویی ارائه دهید.
- اجرای آن محاسبات ساده جاوا است که از نظر عملکرد بسیار کارآمد است.
- اگر به رفتار متفاوتی نیاز دارید ، همیشه می توانید به "asyncbefore/asyncafter = true" تغییر دهید.
با این حال ، عواقبی وجود دارد که باید در نظر داشته باشید:
- در صورت استثنائات ، دولت به آخرین حالت انتظار مداوم از نمونه روند بازگردانده می شود. حتی ممکن است به این معنی باشد که نمونه فرایند هرگز ایجاد نمی شود! شما به راحتی نمی توانید استثناء را به گره در این فرآیند که باعث استثناء می شود ردیابی کنید. شما باید استثناء را در مشتری انجام دهید.
- مسیرهای فرآیند موازی به طور موازی از نظر نخ های جاوا اجرا نمی شوند ، مسیرهای مختلف به صورت متوالی اجرا می شوند ، زیرا ما فقط یک موضوع را داریم و از آن استفاده می کنیم.
- تایمرها نمی توانند قبل از انجام معامله به پایگاه داده آتش بزنند. تایمرها بعداً با جزئیات بیشتری توضیح داده می شوند ، اما آنها توسط تنها قسمت فعال موتور فرآیند که در آن از موضوعات شخصی استفاده می کنیم ، ایجاد می شود: مجری کار. از این رو آنها در یک موضوع خود کار می کنند که تایمرهای مربوطه را از پایگاه داده دریافت می کند. با این حال ، در بانک اطلاعاتی قبل از مشاهده معامله فعلی ، تایمرها قابل مشاهده نیستند. بنابراین تایمر زیر هرگز آتش نمی گیرد:
ادغام معامله
موتور فرآیند میتواند تراکنشها را به تنهایی مدیریت کند (مدیریت تراکنش "مستقل") یا با یک مدیر تراکنش پلت فرم یکپارچه شود.
مدیریت معاملات مستقل
اگر موتور پردازش برای انجام مدیریت تراکنش مستقل پیکربندی شده باشد، همیشه یک تراکنش جدید برای هر دستوری که اجرا می شود باز می کند. برای پیکربندی موتور پردازش برای استفاده از مدیریت تراکنش مستقل، از org. camunda. bpm. engine. impl. cfg. StandaloneProcessEngineConfiguration استفاده کنید:
ProcessEngineConfiguration. createStandaloneProcessEngineConfiguration() . buildProcessEngine();
موارد استفاده برای مدیریت تراکنش مستقل، موقعیتهایی هستند که موتور فرآیند مجبور نیست با سایر منابع تراکنش مانند منابع داده ثانویه یا سیستمهای پیام ادغام شود.
در توزیع Tomcat، موتور فرآیند با استفاده از مدیریت تراکنش مستقل پیکربندی شده است.
یکپارچه سازی مدیر تراکنش
موتور فرآیند را می توان برای ادغام با یک مدیر تراکنش (یا سیستم های مدیریت تراکنش) پیکربندی کرد. خارج از جعبه، موتور فرآیند از ادغام با مدیریت تراکنش Spring و JTA پشتیبانی می کند. اطلاعات بیشتر را می توان در فصل های زیر یافت:
- بخش مدیریت معاملات بهار
- بخش مدیریت تراکنش JTA
موارد استفاده برای یکپارچه سازی مدیر تراکنش موقعیت هایی هستند که موتور پردازش باید با آنها یکپارچه شود
- مدل های برنامه نویسی متمرکز بر تراکنش مانند Java EE یا Spring (در مورد مدیران موجودیت JPA با محدوده تراکنش در Java EE فکر کنید)،
- سایر منابع تراکنش مانند منابع داده ثانویه، سیستم های پیام رسانی یا سایر میان افزارهای تراکنش مانند پشته خدمات وب.
وقتی یک مدیر تراکنش را پیکربندی میکنید، مطمئن شوید که در واقع منبع دادهای را که برای موتور پردازش پیکربندی کردهاید مدیریت میکند. اگر اینطور نیست، منبع داده در حالت خودکار کار می کند. این می تواند منجر به ناهماهنگی در پایگاه داده شود، زیرا تعهدات تراکنش و بازگشت به عقب دیگر انجام نمی شود.
معاملات و زمینه موتور فرآیند
هنگامی که یک فرمان موتور فرآیند اجرا می شود، موتور یک زمینه موتور پردازش ایجاد می کند. Context موجودیت های پایگاه داده را در حافظه پنهان نگه می دارد، به طوری که چندین عملیات روی یک موجودیت منجر به پرس و جوهای متعدد پایگاه داده نمی شود. این همچنین به این معنی است که تغییرات این موجودیت ها انباشته شده و به محض بازگشت Command به پایگاه داده منتقل می شوند. با این حال، باید توجه داشت که معامله فعلی ممکن است در زمان بعدی انجام شود.
اگر یک دستور موتور فرآیند به دستور دیگری تو در تو باشد ، یعنی یک دستور در دستور دیگری اجرا می شود ، رفتار پیش فرض استفاده مجدد از زمینه موتور فرآیند موجود است. این بدان معنی است که فرمان تو در تو به همان موجودات ذخیره شده و تغییرات ایجاد شده برای آنها دسترسی خواهد داشت.
هنگامی که قرار است دستور تو در تو در یک معامله جدید اجرا شود ، برای اجرای آن باید زمینه جدید موتور فرآیند ایجاد شود. در این حالت ، دستور تو در تو از حافظه نهان جدید برای موجودات پایگاه داده ، مستقل از حافظه نهان فرمان قبلی (بیرونی) استفاده می کند. این بدان معنی است که ، تغییرات در حافظه نهان یک دستور برای دستور دیگر نامرئی است و بالعکس. هنگامی که فرمان تو در تو باز می گردد ، تغییرات به طور مستقل از زمینه موتور فرآیند فرمان بیرونی به پایگاه داده می شوند.
از کلاس ابزار پردازش پردازش می توان برای اعلام موتور فرآیند استفاده کرد که یک زمینه موتور فرآیند جدید باید ایجاد شود تا عملیات پایگاه داده در یک دستور موتور فرآیند تو در تو در یک معامله جدید از هم جدا شود. مثال کد جاوا زیر نشان می دهد که چگونه می توان از کلاس استفاده کرد:
تلاش كردنسرانجام
قفل خوش بینانه
موتور Camunda را می توان در برنامه های چند رشته ای استفاده کرد. در چنین تنظیماتی ، هنگامی که چندین موضوع به طور همزمان با موتور فرآیند تعامل دارند ، می تواند اتفاق بیفتد که این موضوعات سعی در انجام تغییراتی در همان داده ها دارند. به عنوان مثال: دو موضوع سعی می کنند همان کار کاربر را همزمان (همزمان) انجام دهند. چنین وضعیتی درگیری است: کار فقط یک بار می تواند انجام شود.
Camunda Engine از یک تکنیک شناخته شده به نام "قفل خوش بینانه" (یا کنترل همزمان همزمان) برای تشخیص و حل چنین شرایطی استفاده می کند.
این بخش در دو بخش ساختار یافته است: قسمت اول قفل خوش بینانه را به عنوان یک مفهوم معرفی می کند. در صورتی که قبلاً با قفل خوش بینانه آشنا باشید ، می توانید از این بخش پرش کنید. بخش دوم استفاده از قفل خوش بینانه در کاموندا را توضیح می دهد.
قفل خوش بینانه چیست؟
قفل خوش بینانه (همچنین کنترل همزمانی خوش بینانه) روشی برای کنترل همزمانی است که در سیستم های مبتنی بر معامله استفاده می شود. قفل خوش بینانه در شرایطی که داده ها بیشتر از آنچه تغییر می کند خوانده می شود ، کارآمدترین است. بسیاری از موضوعات می توانند بدون حذف یکدیگر ، همزمان با همزمان با همزمان همزمان با هم بخوانند. سپس با تشخیص درگیری ها و جلوگیری از به روزرسانی در شرایطی که در آن چندین موضوع سعی در تغییر همزمان با همزمان کردن همان اشیاء داده دارند ، قوام تضمین می شود. اگر چنین درگیری تشخیص داده شود ، اطمینان می شود که فقط یک بروزرسانی موفق می شود و سایر افراد شکست می خورند.
مثال
فرض کنید ما یک جدول پایگاه داده با ورودی زیر داریم:
Id | نسخه | نام | نشانی | … |
---|
8 | 1 | استیو | 3 ، بلوار گردش کار ، شهر توکن | … |
… | … | … | … | … |
در جدول فوق ، یک ردیف واحد داده های کاربر را نشان می دهد. کاربر دارای شناسه منحصر به فرد (کلید اصلی) ، یک نسخه ، یک نام و یک آدرس فعلی است.
ما اکنون وضعیتی را ایجاد می کنیم که در آن 2 معاملات سعی در به روزرسانی این مطلب ، یکی تلاش برای تغییر آدرس ، دیگری که سعی در حذف کاربر دارد. رفتار در نظر گرفته شده این است که یک بار از معاملات موفق می شود و دیگری با خطایی سقط می شود که نشان می دهد درگیری همزمانی تشخیص داده شده است. کاربر سپس می تواند تصمیم بگیرد که معامله را بر اساس آخرین وضعیت داده ها دوباره امتحان کند:
همانطور که در تصویر بالا مشاهده می کنید ، معامله 1 داده های کاربر را می خواند ، کاری را با داده ها انجام می دهد ، کاربر را حذف می کند و سپس مرتکب می شود. معامله 2 در همان زمان شروع می شود و داده های کاربر مشابه را می خواند ، و همچنین روی داده ها کار می کند. هنگامی که معامله 2 سعی در به روزرسانی آدرس کاربر دارد ، یک درگیری تشخیص داده می شود (از آنجا که معامله 1 قبلاً کاربر را حذف کرده است).
این درگیری تشخیص داده می شود زیرا وضعیت فعلی داده های کاربر هنگام انجام معاملات 2 به روزرسانی خوانده می شود. در آن زمان ، معامله همزمان 1 در حال حاضر ردیف حذف شده است. اکنون پایگاه داده منتظر پایان معاملات 1 است. پس از پایان آن ، معامله 2 می تواند ادامه یابد. در این زمان ، ردیف دیگر وجود ندارد و به روزرسانی موفق می شود اما گزارش ها 0 ردیف تغییر کرده اند. یک برنامه می تواند به این و معاملات برگشت 2 واکنش نشان دهد تا از مؤثر شدن سایر تغییرات توسط آن معامله جلوگیری شود.
برنامه (یا کاربر با استفاده از آن) می تواند بیشتر تصمیم بگیرد که آیا معامله 2 باید دوباره انجام شود. در مثال ما ، معامله پس از آن داده های کاربر را پیدا نمی کند و گزارش می دهد که کاربر حذف شده است.
قفل خوش بینانه در مقابل قفل بدبینانه
قفل بدبینانه با قفل های خوانده شده کار می کند. یک قفل خوانده شده یک شیء داده را در خواندن قفل می کند و از خواندن سایر معاملات همزمان نیز جلوگیری می کند. به این ترتیب ، از درگیری ها جلوگیری می شود.
در مثال بالا ، معامله 1 پس از خواندن آن ، داده های کاربر را قفل می کند. هنگام تلاش برای خواندن نیز ، معامله 2 از پیشرفت مسدود می شود. پس از اتمام معامله 1 ، معامله 2 می تواند پیشرفت کند و آخرین ایالت را بخواند. به این ترتیب از درگیری جلوگیری می شود زیرا معاملات همیشه به طور انحصاری روی آخرین وضعیت داده ها کار می کنند.
قفل بدبینانه در شرایطی که نوشته ها به همان اندازه که خوانده می شود و با مشاجره زیاد مکرر است ، کارآمد است.
با این حال ، از آنجا که قفل های بدبینانه منحصر به فرد هستند ، همزمانی کاهش می یابد ، عملکرد تحقیرآمیز. قفل خوش بینانه ، که به جای جلوگیری از بروز آنها ، درگیری ها را تشخیص می دهد ، بنابراین در زمینه سطح بالای همزمانی ارجح است و جایی که خوانده شده بیشتر از آنچه می نویسد ، بیشتر است. همچنین ، قفل بدبینانه می تواند به سرعت منجر به بن بست شود.
بیشتر خواندن
- [1] ویکی پدیا: کنترل همزمانی خوش بینانه
- [2] Stackoverflow: قفل خوش بینانه در مقابل بدبینانه
قفل خوش بینانه در کاموندا
Camunda از قفل خوش بینانه برای کنترل همزمانی استفاده می کند. اگر یک درگیری همزمانی تشخیص داده شود ، یک استثنا پرتاب می شود و معامله به عقب برگردانده می شود. در هنگام اجرای اظهارات به روزرسانی یا حذف ، درگیری ها تشخیص داده می شوند. اجرای اظهارات حذف یا به روزرسانی تعداد ردیف های آسیب دیده را برمی گرداند. اگر این تعداد برابر با صفر باشد ، نشان می دهد که ردیف قبلاً به روز شده یا حذف شده است. در چنین مواردی درگیری تشخیص داده می شود و یک OptisticlockingException پرتاب می شود.
OptisticlockingException
OptisticlockingException را می توان با روش های API پرتاب کرد. فراخوانی زیر از روش کامل (.) را در نظر بگیرید:
TaskService. completetask (ataskid) ؛// ممکن است OptististClockingException را پرتاب کند
روش فوق ممکن است در صورت اجرای روش فراخوانی ، به اصلاح همزمان داده ها منجر به اصلاح همزمان شود.
اجرای شغلی همچنین می تواند باعث شود یک OptisticlockingException پرتاب شود. از آنجا که این انتظار می رود ، اعدام دوباره انجام می شود.
رسیدگی به استثنائات قفل خوش بینانه
در صورت ایجاد دستور فعلی توسط مجری شغل ، OptisticLockingException S به طور خودکار با استفاده از آزمایشات انجام می شود. از آنجا که انتظار می رود این استثنا رخ دهد ، تعداد مجدد مجدد را کاهش نمی دهد.
اگر دستور فعلی توسط یک تماس API خارجی ایجاد شود ، موتور کاموندا معامله فعلی را به آخرین نقطه ذخیره (حالت انتظار) باز می گرداند. اکنون کاربر باید تصمیم بگیرد که چگونه باید از استثنا استفاده شود ، در صورتی که معامله باید دوباره انجام شود یا خیر. همچنین در نظر بگیرید که حتی اگر معامله به عقب برگردانده شود ، ممکن است عوارض جانبی غیر تعامل داشته باشد که به عقب برگردانده نشده است.
برای کنترل دامنه معاملات ، می توان نقاط صرفه جویی در صریح را قبل و بعد از فعالیت ها با استفاده از ادامه های ناهمزمان اضافه کرد.
مکانهای متداول که استثنائات قفل خوش بینانه پرتاب می شود
مکانهای مشترکی وجود دارد که می توان یک OptisticlockingException را پرتاب کرد. مثلا
- رقیب درخواست های خارجی: تکمیل همان کار دو بار ، همزمان.
- نقاط هماهنگ سازی در یک فرآیند: مثال ها دروازه موازی ، چند نمونه و غیره هستند.
مدل زیر یک دروازه موازی را نشان می دهد ، که در آن می تواند OptisticlockingException رخ دهد.
بعد از دروازه موازی باز ، دو کار کاربر وجود دارد. دروازه موازی بسته ، پس از انجام وظایف کاربر ، اعدام ها را به یک ادغام می کند. در بیشتر موارد ، ابتدا یکی از وظایف کاربر انجام می شود. اعدام سپس تا زمانی که کار دوم کاربر انجام شود ، در دروازه موازی بسته شده منتظر می ماند.
با این حال ، همچنین ممکن است که هر دو وظیفه کاربر همزمان انجام شوند. بگویید کار کاربر در بالا به پایان رسیده است. معامله فرض می کند که او اولین بار در دروازه موازی بسته است. کار کاربر در زیر به طور همزمان انجام می شود و معامله همچنین فرض می کند که او اولین بار در دروازه موازی بسته است. هر دو معامله سعی در به روزرسانی یک ردیف دارند ، که نشان می دهد آنها اولین بار در دروازه موازی بسته هستند. در چنین مواردی ، OptisticlockingException پرتاب می شود. یکی از معاملات به عقب برگردانده شده و دیگری موفق به به روزرسانی ردیف می شود.
قفل خوش بینانه و عوارض جانبی غیر متعادل
پس از وقوع یک OptisticlockingException ، معامله به عقب برگردانده می شود. هر کار معامله ای خنثی خواهد شد. کار غیر تعامل مانند ایجاد پرونده ها یا تأثیرات فراخوانی خدمات وب غیر متعادل ، خنثی نخواهد شد. این می تواند به وضعیت متناقض ختم شود.
چندین راه حل برای این مشکل وجود دارد ، متداول ترین آن ادغام نهایی با استفاده از آزمایشات است.
جزئیات اجرای داخلی
بیشتر جداول پایگاه داده موتور Camunda حاوی ستونی به نام Rev_ است. این ستون نشان دهنده نسخه تجدید نظر است. هنگام خواندن یک ردیف ، داده ها در یک "تجدید نظر" داده شده خوانده می شوند. اصلاحات (به روزرسانی ها و حذف ها) همیشه سعی در به روزرسانی ویرایشی که توسط دستور فعلی خوانده شده است. به روزرسانی افزایش تجدید نظر. پس از اجرای بیانیه اصلاح ، تعداد ردیف های آسیب دیده بررسی می شود. اگر تعداد 1 باشد ، استنباط می شود که نسخه خوانده شده هنگام اجرای اصلاح هنوز جریان دارد. در صورت تعداد ردیف های آسیب دیده 0 ، سایر معامله ها هنگام انجام این معامله ، همان داده ها را اصلاح می کنند. این بدان معنی است که یک درگیری همزمانی تشخیص داده می شود و این معامله نباید انجام شود. پس از آن ، معامله به عقب برگردانده می شود (یا فقط به صورت برگشتی مشخص شده) و یک OptisticlockingException پرتاب می شود.
در این صفحه:
ما به دنبال افراد با استعداد هستیم.
موقعیت های باز ما را بررسی کنید.
camunda. org و docs. camunda. org بخشی از سکوی کاموندا |ساخته شده توسط Camunda و همکاران - بیانیه حفظ حریم خصوصی - خدمات Camunda GmbH © 2023
محتوای موجود در این سایت تحت مجوز Creative Commons Attribution-Sharealike 3. 0 بدون گزارش مجوز است.
فارکس بازار مدرن...
ما را در سایت فارکس بازار مدرن دنبال می کنید
برچسب : نویسنده : امین زندگانی بازدید : 46 تاريخ : چهارشنبه 15 شهريور 1402 ساعت: 8:00