برای فعال کردن پشتیبانی معامله ای برای یک حافظه نهان خاص ، پارامتر AtomicityMode را در پیکربندی حافظه نهان تنظیم کنید. برای جزئیات بیشتر به حالت های اتمی مراجعه کنید.
معاملات به شما امکان می دهد چندین عملیات حافظه پنهان ، در یک یا چند کلید ، را به یک معامله اتمی واحد گروه بندی کنید. این عملیات بدون هیچ گونه عملیات درهم آمیخته دیگر بر روی کلیدهای مشخص شده اجرا می شود ، و یا همه موفق می شوند یا همه شکست می خورند. هیچ اجرای جزئی از عملیات وجود ندارد.
می توانید معاملات را برای یک حافظه نهان خاص در پیکربندی حافظه نهان فعال کنید.
کلاس ="org. apache. ignite. configuration. igniteconfiguration"> نام ="تنظیم معاملات"> کلاس ="org. apache. ignite. configuration. TransactionConfiguration"> نام ="txtimeoutonpartitionmapexchange" مقدار ="20000"/>
شکل گیری کله = جدید شکل گیری(); کله.نام("cachename"); کله.روش سنجش(روش.معامله گر); پیکربندی CFG = جدید پیکربندی(); CFG.پیکربندی setCacheConfiguration(کله); // پیکربندی معاملات اختیاری. پیکربندی TM را در اینجا پیکربندی کنید. پیکربندی معامله txcfg = جدید پیکربندی معامله(); CFG.پیکربندی setTransactionConfiguration(txcfg); // شروع یک گره آتش گرفتن.شروع(CFG);
قارچ CFG = جدید پیکربندی شکل گیری = جدید[] جدید شکل گیری("txcache") حالت اتمی = روش.معامله گر > >, پیکربندی معامله = جدید پیکربندی معامله پیش فرض = تراکنش.خوش بین > >;
این API در حال حاضر برای C ++ در دسترس نیست. می توانید از پیکربندی XML استفاده کنید.
اجرای معاملات
API با ارزش کلیدی رابط کاربری برای شروع و تکمیل معاملات و همچنین دریافت معیارهای مربوط به معامله فراهم می کند. رابط را می توان از نمونه ای از اشتعال بدست آورد.
مشتعل شدن مشتعل شدن = آتش گرفتن.مشتعل شدن(); شغلی معاملات = مشتعل شدن.معاملات(); تلاش كردن (معامله tx = معاملات.از هم برای()) عدد صحیح سلام = مخازن.گرفتن("سلام"); if (سلام == 1) مخازن.قرار دادن("سلام", 11); مخازن.قرار دادن("جهان", 22); tx.مرتکب شدن(); >
قارچ CFG = جدید پیکربندی Discoveryspi = جدید tcpdiscoveryspi محلی = 48500, دارای تاریخ محلی = 20, منزل = جدید TCPDiscoveryStaticipfinder نقاط پایانی = جدید[] "127. 0. 0. 1:48500.. 48520" > > >, شکل گیری = جدید[] جدید شکل گیری نام = "cachename", حالت اتمی = روش.معامله گر > >, پیکربندی معامله = جدید پیکربندی معامله پیش فرض TimeoutonPartitionMapexChange = مدت زمان.از سال دوم(20) > >; قارچ مشتعل شدن = آتش گرفتن.شروع(CFG); قارچ مخازن = مشتعل شدن.گلهرشته, در نظر گرفتن>("cachename"); مخازن.قرار دادن("سلام", 1); قارچ معاملات = مشتعل شدن.تعاملی(); استفاده كردن (قارچ tx = معاملات.از هم برای()) در نظر گرفتن سلام = مخازن.گرفتن("سلام"); if (سلام == 1) مخازن.قرار دادن("سلام", 11); > مخازن.قرار دادن("جهان", 22); tx.مرتکب شدن(); >
معاملات معاملات = مشتعل شدن.تعاملی(); معامله tx = معاملات.از هم برای(); در نظر گرفتن سلام = مخازن.گرفتن("سلام"); if (سلام == 1) مخازن.قرار دادن("سلام", 11); مخازن.قرار دادن("جهان", 22); tx.مرتکب شدن();
حالت های همزمانی و سطح انزوا
حافظه پنهان با حالت اتمیتیک تراکنش از هر دو حالت همزمانی خوش بینانه و بدبینانه برای معاملات پشتیبانی می کند. حالت همزمانی تعیین می کند چه موقع قفل معامله در سطح ورود به دست می آید: در زمان دسترسی به داده ها یا در مرحله آماده سازی. قفل شدن از دسترسی همزمان به یک شی جلوگیری می کند. به عنوان مثال ، هنگامی که سعی می کنید یک مورد لیست TODO را با قفل بدبینانه به روز کنید ، سرور قفل را روی شیء قرار می دهد تا اینکه معامله را انجام دهید یا بازپرداخت کنید و هیچ معامله یا عمل دیگری مجاز به به روزرسانی همان ورودی نیست. صرف نظر از حالت همزمانی مورد استفاده در یک معامله ، لحظه ای در زمان وجود دارد که تمام ورودی های ثبت شده در معامله قبل از انجام این کار قفل شده اند.
سطح انزوا ، چگونگی انجام معاملات همزمان را نشان می دهد و عملیات را در همان کلیدها انجام می دهد. Ignite از سطح read_commed ، تکرار شده_رد و سریال قابل انزوا پشتیبانی می کند.
تمام ترکیبات حالت های همزمانی و سطح انزوا مجاز است. در زیر توضیحات رفتار سیستم و ضمانت های ارائه شده توسط هر ترکیب همزمان-جداسازی ارائه شده است.
معاملات بدبینانه
در معاملات بدبینانه ، قفل ها در اولین دسترسی به خواندن یا نوشتن (بسته به سطح انزوا) به دست می آیند و توسط معامله تا زمانی که انجام شود یا به عقب برگردانده شود ، انجام می شود. در این حالت قفل ها ابتدا روی گره های اولیه به دست می آیند و سپس در مرحله آماده سازی به گره های پشتیبان ارتقا می یابند. سطح جداسازی زیر را می توان با حالت همزمانی بدبینانه پیکربندی کرد:
- read_commited - داده ها بدون قفل خوانده می شوند و هرگز در خود معامله ذخیره نمی شوند. اگر این در پیکربندی حافظه نهان مجاز باشد ، داده ها ممکن است از یک گره پشتیبان خوانده شوند. در این حالت جداسازی می توانید به اصطلاح خوانده شده غیر قابل تکرار داشته باشید زیرا یک معامله همزمان می تواند داده ها را هنگام خواندن داده ها دو بار در معامله خود تغییر دهد. این قفل فقط در زمان دسترسی به نوشتن اول به دست می آید (این شامل دعوت نامه ورودی پردازشگر) است. این بدان معنی است که ورودی که در طول معامله خوانده شده است ممکن است تا زمان انجام معامله دارای ارزش متفاوتی باشد. در این مورد هیچ استثنائی پرتاب نمی شود.
- Repebable_read - قفل ورودی به دست می آید و داده ها از گره اصلی در اولین دسترسی خواندن یا نوشتن و در نقشه معامله محلی ذخیره می شوند. تمام دسترسی متوالی به همان داده ها محلی است و آخرین ارزش معامله خوانده شده یا به روز شده را برمی گرداند. این بدان معناست که هیچ معاملات همزمان دیگری نمی تواند در داده های قفل شده تغییراتی ایجاد کند ، و شما برای معامله خود خواندن قابل تکرار دارید.
- Serializable - در حالت بدبینانه ، این سطح جداسازی به همان روشی که قابل تکرار_رد است کار می کند.
توجه داشته باشید که در حالت بدبین ، ترتیب قفل مهم است. علاوه بر این ، قفل ها به صورت متوالی و دقیقاً به ترتیب مشخص به دست می آیند.
مهم
محدودیت های تغییر توپولوژی
توجه داشته باشید که اگر حداقل یک قفل معامله بدبینانه به دست بیاید ، تغییر توپولوژی حافظه نهان تا زمان انجام معامله یا بازگشت مجدد غیرممکن است. بنابراین ، شما باید از نگه داشتن قفل های معامله برای مدت طولانی خودداری کنید.
معاملات خوش بینانه
در معاملات خوش بینانه ، قفل های ورودی در مرحله اول 2pc ، در مرحله آماده سازی بر روی گره های اولیه به دست می آیند و سپس به گره های پشتیبان ارتقا می یابند و پس از انجام معامله آزاد می شوند. در صورت عقب نشینی معامله ، قفل ها هرگز به دست نمی آیند و هیچ تلاشی انجام نشده است. سطح جداسازی زیر را می توان با حالت همزمانی خوش بینانه پیکربندی کرد:
- read_commited - تغییراتی که باید برای حافظه نهان اعمال شود ، بر روی گره مبدأ جمع آوری شده و بر روی تعهد معامله اعمال می شود. داده های معامله بدون قفل خوانده می شود و هرگز در معامله ذخیره نمی شود. اگر این در پیکربندی حافظه نهان مجاز باشد ، داده ها ممکن است از یک گره پشتیبان خوانده شوند. در این انزوا می توانید به اصطلاح خواندن غیر قابل تکرار داشته باشید زیرا یک معامله همزمان می تواند هنگام خواندن داده ها دو بار در معامله خود داده ها را تغییر دهد. این ترکیب حالت بررسی نمی کند که آیا مقدار ورود از اولین دسترسی خواندن یا نوشتن اصلاح شده است و هرگز یک استثناء خوش بینانه را ایجاد نمی کند.
- Reperable_read - معاملات در این سطح جداسازی مشابه با معاملات خوش بینانه Read_commed با تنها یک تفاوت: مقادیر خواندن روی گره مبدأ ذخیره می شوند و تمام خوانده های بعدی تضمین می شوند محلی هستند. این ترکیب حالت بررسی نمی کند که آیا مقدار ورود از اولین دسترسی خواندن یا نوشتن اصلاح شده است و هرگز یک استثناء خوش بینانه را ایجاد نمی کند.
- Serializable - نسخه ورود را پس از دسترسی به خواندن برای اولین بار ذخیره می کند. اگر موتور IGNITE تشخیص دهد حداقل یکی از ورودی های مورد استفاده به عنوان بخشی از معامله آغاز شده اصلاح شده است ، Ignite معامله را در مرحله تعهد انجام نمی دهد. به طور خلاصه ، این بدان معنی است که اگر Ignite تشخیص دهد که در مرحله تعهد معامله درگیری وجود دارد ، معامله را شکست می دهد ، TransactionOptimisticexception را پرتاب می کند و هرگونه تغییر ایجاد شده را به عقب می اندازد. حتماً این استثنا را کنترل کرده و معامله را دوباره امتحان کنید.
شکل گیریعدد صحیح, رشته> CFG = جدید شکل گیری<>(); CFG.روش سنجش(روش.معامله گر); CFG.نام("mycache"); جبههعدد صحیح, رشته> مخازن = مشتعل شدن.getorcreatecache(CFG); // تعداد محدودیت ها را دوباره انجام دهید. در نظر گرفتن مجدداً = 10; در نظر گرفتن مجدداً = 0; // معامله را در حالت خوش بینانه با جداسازی سریال شروع کنید // مرحله. در حالی که (مجدداً مجدداً) مجدداً++; تلاش كردن (معامله tx = مشتعل شدن.معاملات().از هم برای(تراکنش.خوش بین, تساوی معامله.سریال پذیر)) // ورودی های حافظه نهان را به عنوان بخشی از این معامله اصلاح کنید. مخازن.قرار دادن(1, "فو"); مخازن.قرار دادن(2, "بار"); // انجام معامله tx.مرتکب شدن(); // معامله موفق شد. حلقه در حالی را ترک کنید. زنگ تفريح; > گرفتن (TransactionOptimisticexception e) // معامله شکست خورده است. دوباره امتحان کنید > >
قارچ CFG = جدید پیکربندی Discoveryspi = جدید tcpdiscoveryspi محلی = 48500, دارای تاریخ محلی = 20, منزل = جدید TCPDiscoveryStaticipfinder نقاط پایانی = جدید[] "127. 0. 0. 1:48500.. 48520" > > >, شکل گیری = جدید[] جدید شکل گیری نام = "cachename", حالت اتمی = روش.معامله گر > >, پیکربندی معامله = جدید پیکربندی معامله پیش فرض TimeoutonPartitionMapexChange = مدت زمان.از سال دوم(20) > >; قارچ مشتعل شدن = آتش گرفتن.شروع(CFG); // بار تعداد محدود را دوباره انجام دهید قارچ مجدداً = 10; قارچ مجدداً = 0; // معامله را در حالت خوش بینانه با سطح جداسازی سریال شروع کنید در حالی که (مجدداً مجدداً) مجدداً++; تلاش كردن استفاده كردن (قارچ tx = مشتعل شدن.تعاملی().از هم برای(تراکنش.خوش بین, تساوی معامله.سریال پذیر)) // ورودی های حافظه نهان را به عنوان بخشی از این معامله اصلاح کنید. // انجام معامله tx.مرتکب شدن(); // معامله موفق شد. حلقه در حالی را ترک کنید. زنگ تفريح; > > گرفتن (TransactionOptimisticexception) // معامله شکست خورده است. دوباره امتحان کنید > >
// تعداد محدودیت ها را دوباره انجام دهید. در نظر گرفتن محاصره کردن مجدداً = 10; در نظر گرفتن مجدداً = 0; // معامله را در حالت خوش بینانه با سطح جداسازی سریال شروع کنید. در حالی که (مجدداً مجدداً) مجدداً++; تلاش كردن معامله tx = مشتعل شدن.تعاملی().از هم برای( تراکنش::خوش بین, تساوی معامله::سریال پذیر); // انجام معامله tx.مرتکب شدن(); // معامله موفق شد. حلقه در حالی را ترک کنید. زنگ تفريح; > گرفتن (یارگر e) // معامله شکست خورده است. دوباره امتحان کنید > >
نکته مهم دیگر در اینجا این است که یک معامله حتی اگر یک ورودی بدون اصلاح خوانده شود (cache. put (...)) انجام می شود ، زیرا ارزش ورود می تواند برای منطق در معامله آغاز شده مهم باشد.
توجه داشته باشید که ترتیب کلیدی برای معاملات read_commed و قابل تکرار_رد مهم است زیرا قفل ها هنوز هم به طور متوالی در این حالت ها به دست می آیند.
قوام را بخوانید
برای دستیابی به قوام کامل خواندن در حالت بدبین ، باید قفل های خواندن به دست بیایند. این بدان معنی است که قوام کامل بین خوانده شده در حالت بدبینانه فقط با معاملات قابل تکرار و یا قابل تکرار (یا سریال قابل سریال) قابل دستیابی است.
هنگام استفاده از معاملات خوش بینانه ، با عدم توسل درگیری های احتمالی بین خواندن ، می توان قوام کامل خواندن را بدست آورد. این رفتار توسط حالت سریال خوش بینانه ارائه می شود. با این حال ، توجه داشته باشید که تا زمانی که تعهد اتفاق بیفتد ، هنوز هم می توانید یک وضعیت معامله جزئی را بخوانید ، بنابراین منطق معامله باید از آن محافظت کند. فقط در مرحله تعهد ، در صورت بروز هرگونه درگیری ، یک TransactionOptimisticexception به شما امکان می دهد تا معامله را دوباره امتحان کنید.
مهم
تشخیص بن بست
یک قانون اساسی که باید هنگام کار با معاملات توزیع شده از آن پیروی کنید این است که قفل های کلیدهای شرکت کننده در یک معامله باید به همان ترتیب به دست بیایند. نقض این قانون می تواند منجر به بن بست توزیع شود.
Ignite از بن بست های توزیع شده جلوگیری نمی کند ، بلکه قابلیت های داخلی دارد که اشکال زدایی و رفع چنین شرایطی را آسان تر می کند.
در قطعه کد زیر ، معامله با یک زمان بندی آغاز شده است. اگر زمان پایان یابد ، روش تشخیص بن بست سعی می کند بن بست احتمالی را پیدا کند که ممکن است باعث ایجاد زمان شود. هنگامی که مدت زمان منقضی می شود ، TransactimeOutexception به عنوان علت Cacheexception بدون در نظر گرفتن یک بن بست ، به کد برنامه تولید می شود. با این حال ، اگر یک بن بست تشخیص داده شود ، علت معاملات TransactionTimeOutexception TransactionDeadLockexception (حداقل برای یک معامله درگیر در بن بست) خواهد بود.
شکل گیریعدد صحیح, رشته> CFG = جدید شکل گیری<>(); CFG.روش سنجش(روش.معامله گر); CFG.نام("mycache"); جبههعدد صحیح, رشته> مخازن = مشتعل شدن.getorcreatecache(CFG); تلاش كردن (معامله tx = مشتعل شدن.معاملات().از هم برای(تراکنش.بدبین, تساوی معامله.read_commed, 300, 0)) مخازن.قرار دادن(1, "1"); مخازن.قرار دادن(2, "1"); tx.مرتکب شدن(); > گرفتن (مفهوم e) if (e.جنجال() به عنوان مثال از TransactimeTimeouTexception && e.جنجال().جنجال() به عنوان مثال از TransactionDeadLockexception) سیستم.خارج.چاپل(e.جنجال().جنجال().جبهه()); >
قارچ CFG = جدید پیکربندی Discoveryspi = جدید tcpdiscoveryspi محلی = 48500, دارای تاریخ محلی = 20, منزل = جدید TCPDiscoveryStaticipfinder نقاط پایانی = جدید[] "127. 0. 0. 1:48500.. 48520" > > >, شکل گیری = جدید[] جدید شکل گیری نام = "cachename", حالت اتمی = روش.معامله گر > >, پیکربندی معامله = جدید پیکربندی معامله پیش فرض TimeoutonPartitionMapexChange = مدت زمان.از سال دوم(20) > >; قارچ مشتعل شدن = آتش گرفتن.شروع(CFG); قارچ صفر = مشتعل شدن.getorcreatecacheدر نظر گرفتن, در نظر گرفتن>("Intcache"); تلاش كردن استفاده كردن (قارچ tx = مشتعل شدن.تعاملی().از هم برای(تراکنش.بدبین, تساوی معامله.خوانده شده متعهد, مدت زمان.قشر(300), 0)) صفر.قرار دادن(1, 1); صفر.قرار دادن(2, 1); tx.مرتکب شدن(); > > گرفتن (TransactimeTimeouTexception e) کنسول.خط(e.پیام); > گرفتن (TransactionDeadLockexception e) کنسول.خط(e.پیام); >
تلاش كردن معامله tx = مشتعل شدن.تعاملی().از هم برای( تراکنش::بدبین, تساوی معامله::read_commed, 300, 0); مخازن.قرار دادن(1, 1); مخازن.قرار دادن(2, 1); tx.مرتکب شدن(); > گرفتن (یارگر& اشتباه کردن) std::چاک <"خطایی رخ داد:" <اشتباه کردن.متن() <std::پایان دادن; std::سد.گرفتن(); برگشت اشتباه کردن.دریافت کد(); >
پیام TransactionDeadLockexception حاوی اطلاعات مفیدی است که می تواند به شما در یافتن دلیل بن بست کمک کند.
بن بست تشخیص داده شده: K1: TX1 قفل ، قفل منتظر TX2. K2: TX2 قفل ، قفل منتظر TX1. معاملات: TX1[دارای ضرب=جبهه[برتری=74949328 ،زمان=1463469328421 ،سفارش=1463469326211 ،گره=1], نودیده=AD68354D-07B8-4BE5-85BB-F5F2362FBB88 ،نخ دار=73] TX2[دارای ضرب=جبهه[برتری=74949328 ،زمان=1463469328421 ،سفارش=1463469326210 ،گره=1], نودیده=AD68354D-07B8-4BE5-85BB-F5F2362FBB88 ،نخ دار=74] کلیدها: K1[کلید=1, مخازن=پیش فرض] K2[کلید=2, مخازن=پیش فرض]
تشخیص بن بست یک روش چند مرحله ای است که بسته به تعداد گره های موجود در خوشه ، کلیدها و معاملات که در یک بن بست احتمالی درگیر هستند ، می تواند تکرارهای زیادی را انجام دهد. یک آغازگر تشخیص بن بست گره ای است که در آن معامله آغاز شد و با TransactionTimeOutexception شکست خورد. این گره بررسی می کند که آیا یک بن بست با تبادل درخواست ها/پاسخ ها با سایر گره های از راه دور رخ داده است ، و سپس گزارش مربوط به بن بست را تهیه می کند که با TransactionDeadLockexception ارائه می شود. هر پیام (درخواست/پاسخ) به عنوان تکرار شناخته می شود.
از آنجایی که یک تراکنش تا زمانی که مراحل تشخیص بن بست کامل نشده است، بازگردانده نمی شود، گاهی اوقات منطقی است که پارامترها (نشان داده شده در زیر) را تنظیم کنید، اگر می خواهید زمان قابل پیش بینی برای بازگشت تراکنش داشته باشید.
- IgniteSystemProperties. IGNITE_TX_DEADLOCK_DETECTION_MAX_ITERS - حداکثر تعداد تکرارها را برای رویه تشخیص بن بست مشخص می کند. اگر مقدار این ویژگی کمتر یا مساوی صفر باشد، تشخیص بن بست غیرفعال است (به طور پیش فرض 1000).
- IgniteSystemProperties. IGNITE_TX_DEADLOCK_DETECTION_TIMEOUT - زمان پایان مکانیسم تشخیص بن بست را مشخص می کند (به طور پیش فرض 1 دقیقه).
توجه داشته باشید که اگر تکرارها خیلی کم باشد، ممکن است یک گزارش بن بست ناقص دریافت کنید.
معاملات بدون بن بست
برای تراکنش های OPTIMISTIC SRIALIZABLE، قفل ها به صورت متوالی به دست نمی آیند. در این حالت، کلیدها به هر ترتیبی قابل دسترسی هستند زیرا قفل های تراکنش به موازات یک بررسی اضافی به دست می آیند که به Ignite اجازه می دهد از بن بست جلوگیری کند.
برای توضیح نحوه عملکرد قفل ها در تراکنش های SERIALIZABLE باید مفاهیمی را معرفی کنیم. در Ignite، به هر تراکنش یک نسخه قابل مقایسه به نام XidVersion اختصاص داده می شود. پس از انجام تراکنش، به هر ورودی که در تراکنش نوشته می شود، یک نسخه قابل مقایسه جدید به نام EntryVersion اختصاص داده می شود. یک تراکنش OPTIMISTIC SERIALIZABLE با نسخه XidVersionA با یک TransactionOptimisticException شکست می خورد اگر:
- یک تراکنش PESSIMISTIC یا غیرقابل سریال OPTIMISTIC در حال انجام است که یک ورودی تراکنش SERIALIZABLE را قفل می کند.
- There is another ongoing OPTIMISTIC SERIALIZABLE transaction with version XidVersionB such that XidVersionB>XidVersionA و این تراکنش روی ورودی تراکنش SERIALIZABLE یک قفل دارد.
- زمانی که تراکنش OPTIMISTIC SERIALIZABLE همه قفل های مورد نیاز را به دست آورد، ورودی با نسخه فعلی متفاوت از نسخه مشاهده شده قبل از انجام وجود دارد.
توجه داشته باشید
در یک محیط بسیار همزمان، قفل خوش بینانه ممکن است منجر به نرخ بالای شکست تراکنش شود، اما قفل بدبینانه می تواند منجر به بن بست شود اگر قفل ها با ترتیب متفاوتی توسط تراکنش ها به دست آیند.
با این حال، در یک محیط بدون مناقشه، قفل سریالسازی خوشبینانه ممکن است عملکرد بهتری را برای تراکنشهای بزرگ ارائه دهد، زیرا تعداد سفرهای شبکه تنها به تعداد گرههایی که تراکنش در آن قرار دارد بستگی دارد و به تعداد کلیدهای تراکنش بستگی ندارد.
رسیدگی به تراکنش های ناموفق
یک تراکنش ممکن است با استثناهای زیر شکست بخورد:
CacheException ناشی از TransactionTimeoutException
در صورت پایان معاملات ، TransactionTimeOutexception تولید می شود.
برای حل این استثنا ، زمان وقوع را افزایش دهید یا معامله را کوتاه تر کنید.
Cacheexception ناشی از TransactionTimeOutexception ، که توسط TransactionDeadLockexception ایجاد می شود
اگر معامله خوش بینانه به دلایلی نتواند ، این استثنا پرتاب شود. در بیشتر موارد ، این استثناء زمانی اتفاق می افتد که داده هایی که معامله در تلاش برای به روزرسانی بود به طور همزمان تغییر کرد.
معامله را دوباره انجام دهید.
اگر معامله خوش بینانه به دلایلی نتواند ، این استثنا پرتاب شود. در بیشتر سناریوها ، این استثناء زمانی اتفاق می افتد که داده هایی که معامله در تلاش برای به روزرسانی بود به طور همزمان تغییر یابد.
معامله را دوباره انجام دهید.
این استثناء هنگامی اتفاق می افتد که یک معامله به عقب برگردانده شود (به صورت خودکار یا دستی). در این حالت ، داده ها سازگار است.
از آنجا که داده ها در حالت سازگار هستند ، می توانید معامله را دوباره امتحان کنید.
یک استثناء بعید که به دلیل یک مسئله داخلی یا ارتباطی غیر منتظره اتفاق می افتد. این استثنا برای گزارش سناریوهای مشکل ساز که توسط زیر سیستم معاملاتی پیش بینی نشده بودند و به درستی از آن برخورد نشده اند ، وجود دارد.
در صورت بروز استثنا ، داده ها ممکن است سازگار نباشند. بارگیری مجدد داده ها و گزارش به انجمن توسعه.
خاتمه معاملات طولانی مدت
برخی از رویدادهای خوشه ای باعث می شوند فرآیند تبادل نقشه پارتیشن و تغییر مجدد داده ها در یک خوشه اشتعال برای اطمینان از حتی توزیع توزیع داده ها در سراسر خوشه. نمونه ای از چنین رویدادی ، رویداد تغییر خوشه ای است که هر زمان که یک گره جدید به خوشه می پیوندد یا موجود موجود ، آن را ترک می کند. به علاوه ، هر بار که یک حافظه نهان جدید یا SQL ایجاد می شود ، تبادل نقشه پارتیشن شروع می شود.
هنگامی که مبادله نقشه پارتیشن شروع می شود ، Ignite در یک مرحله خاص قفل جهانی را بدست می آورد. قفل را نمی توان بدست آورد در حالی که معاملات ناقص به طور موازی انجام می شود. این معاملات مانع از حرکت به جلو فرایند تبادل نقشه پارتیشن می شوند ، بنابراین ، برخی از عملیات مانند یک فرآیند پیوستن گره جدید را مسدود می کند.
از روش transactionconfiguration. settxtimeoutonpartitionmapexchange (…) استفاده کنید تا حداکثر زمان مجاز برای معاملات طولانی مدت خود را برای جلوگیری از تبادل نقشه پارتیشن تنظیم کنید. پس از آتش سوزی زمان ، تمام معاملات ناقص به عقب برگردانده می شوند و اجازه می دهند مبادله نقشه پارتیشن ادامه یابد.
این مثال نحوه پیکربندی زمان را نشان می دهد:
کلاس ="org. apache. ignite. configuration. igniteconfiguration"> نام ="تنظیم معاملات"> کلاس ="org. apache. ignite. configuration. TransactionConfiguration"> نام ="txtimeoutonpartitionmapexchange" مقدار ="20000"/>
// ایجاد پیکربندی پیکربندی CFG = جدید پیکربندی(); // ایجاد پیکربندی معامله پیکربندی معامله txcfg = جدید پیکربندی معامله(); // زمان بندی را 20 ثانیه تنظیم کنید txcfg.settxtimeoutonpartitionmapexchange(20000); CFG.پیکربندی setTransactionConfiguration(txcfg); // گره را شروع کنید آتش گرفتن.شروع(CFG);
قارچ CFG = جدید پیکربندی پیکربندی معامله = جدید پیکربندی معامله پیش فرض TimeoutonPartitionMapexChange = مدت زمان.از سال دوم(20) > >; آتش گرفتن.شروع(CFG);
این API در حال حاضر برای C ++ در دسترس نیست. می توانید از پیکربندی XML استفاده کنید.
نظارت بر معاملات
برای لیست معیارهایی که برخی از اطلاعات مربوط به معامله را در معرض دید قرار می دهند ، به بخش معاملات نظارت مراجعه کنید.
برای اطلاعات در مورد نحوه ردیابی معاملات ، به بخش ردیابی مراجعه کنید.
همچنین می توانید از Script Control برای دریافت اطلاعات در مورد یا لغو معاملات خاص در خوشه استفاده کنید.
© 2023 بنیاد نرم افزار Apache. Apache ، Apache Ignite ، Apache Feather و آرم Apache Ignite یا علائم تجاری ثبت شده یا علائم تجاری بنیاد نرم افزار Apache هستند.
معاملات FX...
ما را در سایت معاملات FX دنبال می کنید
برچسب : نویسنده : شهلا ریاحی بازدید : 48 تاريخ : پنجشنبه 16 شهريور 1402 ساعت: 13:59