Давайте рассмотрим пример пользовательского интерфейса для редактирования информации о клиенте.Пользователь редактирует 5 полей и нажимает «отправить».Поскольку мы хорошие абстракционисты, мы перенесли изменения в 5 полей и сделали их разными командами (описывающими редактирование определенного поля).
Обработчики команд заканчивают тем, что задают свойства для сохраняемых объектовс помощью такого инструмента, как NHibernate, в итоге мы выполняем ОБНОВЛЕНИЕ для базы данных.
Мой главный вопрос: с точки зрения производительности базы данных, имеет ли смысл выпускать единственное ОБНОВЛЕНИЕ?оператор или это нормально, чтобы выдать 5 различных операторов UPDATE?
Мне нравится идея, что обработчик команд является границей транзакций.Либо он работает, и транзакция фиксируется, либо нет, и транзакция откатывается (и мы, возможно, добавим очередь в очередь, чтобы повторить попытку).Успех или неудача каждой команды не зависит от другой.
Другой подход может заключаться в том, чтобы обернуть обработку этих команд в одну транзакцию базы данных, чтобы, когда NHibernate решает сбросить, он заканчивал тем, что отправлял однуОБНОВИТЬ.Но это делает обработку команд соглашением типа «все или ничего», и я не могу обязательно выполнять их асинхронно.
Но если бы я хотел убедиться, что все команды выполнены правильно, и выполнить откат полностьюв случае неудачи?Может быть, есть одна распределенная транзакция, содержащая много меньших транзакций?Это может привести к конфликту базы данных, увеличивая риск взаимоблокировок, что замедляет обработку (еще больше увеличивая риск взаимоблокировок).Но в то же время последовательность является ключевым фактором.Я полагаю, что это компромисс между доступностью и согласованностью (см. CAP).