Оптимістичне блокування (англ. Optimistic Offline Lock) — шаблон проєктування, який запобігає конфлікту між бізнес-транзакціями, що конкурують шляхом їх виявлення та відкату транзакції.
Опис
Часто бізнес-транзакції вимагають виконання одразу декількох системних транзакцій. Якщо при взаємодії із системою виникає декілька транзакцій, ми більше не можемо покладатися тільки на систему управління базою даних, щоб бути впевненими в тому, що бізнес-транзакція залишить дані в консистентному стані. Цілісність даних знаходиться під загрозою, кожного разу, коли два користувачі працюють із одними і тими ж даними.
Даний шаблон розв'язує цю проблему, перевіряючи завершеність однієї транзакції та відсутність конфліктів з іншою.
Даний шаблон варто використовувати тоді коли шанси на конфлікт не великі (доступ до одних і тих самих даних різними користувачами відбувається рідко), або ж тоді коли не має суворої вимоги в дотримані консистенції даних.
Алгоритм
- Клієнт 1 отримує запис під номером 19 із номером версії 1.
- Клієнт 2 отримує той самий запис під номером 19 із номером версії 1.
- Обидва клієнти роблять зміни над одними і тими самими даними.
- Клієнт 2 зберігає свої зміни в сховищі та збільшує номер версії до 2.
- Клієнт 1 намагається зберегти свої зміни. Він перевіряє номер версії свого запису із тим що в сховищі та бачить що вони відрізняються. Клієнт може скасувати транзакцію, або ж перевірити наявність конфлікту між даними та спробувати його вирішити.
Реалізація
При реалізації нам необхідно до сутності додати номер версії
public class User { public int Id { get; set; } public int RevisionNumber { get; set; } // як альтернатива номеру версії може бути значення дня останньої зміни // public DateTime UpdatedAt { get; set; } }
Тоді при збережені змін нам варто перевірити чи номер версії нашого запису збігається із тим, що в сховищі.
public void Update(UserDto userDto) { User user = db.GetUser(userDto.UserId); if (user.RevisionNumber != userDto.RevisionNumber) { db.Rollback(); return; } db.Update(userDto); }
Див. також
Джерела
- Optimistic Offline Lock
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Optimistichne blokuvannya angl Optimistic Offline Lock shablon proyektuvannya yakij zapobigaye konfliktu mizh biznes tranzakciyami sho konkuruyut shlyahom yih viyavlennya ta vidkatu tranzakciyi OpisChasto biznes tranzakciyi vimagayut vikonannya odrazu dekilkoh sistemnih tranzakcij Yaksho pri vzayemodiyi iz sistemoyu vinikaye dekilka tranzakcij mi bilshe ne mozhemo pokladatisya tilki na sistemu upravlinnya bazoyu danih shob buti vpevnenimi v tomu sho biznes tranzakciya zalishit dani v konsistentnomu stani Cilisnist danih znahoditsya pid zagrozoyu kozhnogo razu koli dva koristuvachi pracyuyut iz odnimi i timi zh danimi Danij shablon rozv yazuye cyu problemu pereviryayuchi zavershenist odniyeyi tranzakciyi ta vidsutnist konfliktiv z inshoyu Danij shablon varto vikoristovuvati todi koli shansi na konflikt ne veliki dostup do odnih i tih samih danih riznimi koristuvachami vidbuvayetsya ridko abo zh todi koli ne maye suvoroyi vimogi v dotrimani konsistenciyi danih AlgoritmKliyent 1 otrimuye zapis pid nomerom 19 iz nomerom versiyi 1 Kliyent 2 otrimuye toj samij zapis pid nomerom 19 iz nomerom versiyi 1 Obidva kliyenti roblyat zmini nad odnimi i timi samimi danimi Kliyent 2 zberigaye svoyi zmini v shovishi ta zbilshuye nomer versiyi do 2 Kliyent 1 namagayetsya zberegti svoyi zmini Vin pereviryaye nomer versiyi svogo zapisu iz tim sho v shovishi ta bachit sho voni vidriznyayutsya Kliyent mozhe skasuvati tranzakciyu abo zh pereviriti nayavnist konfliktu mizh danimi ta sprobuvati jogo virishiti RealizaciyaPri realizaciyi nam neobhidno do sutnosti dodati nomer versiyi public class User public int Id get set public int RevisionNumber get set yak alternativa nomeru versiyi mozhe buti znachennya dnya ostannoyi zmini public DateTime UpdatedAt get set Todi pri zberezheni zmin nam varto pereviriti chi nomer versiyi nashogo zapisu zbigayetsya iz tim sho v shovishi public void Update UserDto userDto User user db GetUser userDto UserId if user RevisionNumber userDto RevisionNumber db Rollback return db Update userDto Div takozhParalelizm Tranzakciya bazi danih Rivni izolovanosti tranzakcij Pesimistichne blokuvannya shablon proyektuvannya DzherelaOptimistic Offline Lock