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