Оптимістичне блокування (шаблон проєктування)Оптимістичне блокування (англ. Optimistic Offline Lock) — шаблон проєктування, який запобігає конфлікту між бізнес-транзакціями, що конкурують шляхом їх виявлення та відкату транзакції. ОписЧасто бізнес-транзакції вимагають виконання одразу декількох системних транзакцій. Якщо при взаємодії із системою виникає декілька транзакцій, ми більше не можемо покладатися тільки на систему управління базою даних, щоб бути впевненими в тому, що бізнес-транзакція залишить дані в консистентному стані. Цілісність даних знаходиться під загрозою, кожного разу, коли два користувачі працюють із одними і тими ж даними. Даний шаблон розв'язує цю проблему, перевіряючи завершеність однієї транзакції та відсутність конфліктів з іншою. Даний шаблон варто використовувати тоді коли шанси на конфлікт не великі (доступ до одних і тих самих даних різними користувачами відбувається рідко), або ж тоді коли не має суворої вимоги в дотримані консистенції даних. Алгоритм
РеалізаціяПри реалізації нам необхідно до сутності додати номер версії 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);
}
Див. також
Джерела |