Является ли UnitOfWork равной Транзакции? Или это больше, чем это?
Интернет полон информации о UnitOfWork
шаблон; даже ТАК не исключение.
Я до сих пор не понимаю что-то об этом. В моем понимании UnitOfWork = Transaction in DB
, Это все; ни больше ни меньше.
Это правильно?
Мое замешательство связано с тем, как это реализовано в разных ORM
s. NHibernate
использования ISession
больше, чем просто Transaction
, Dapper
оставляет все тебе.
Мой вопрос здесь о шаблоне дизайна только без учета каких-либо ORM
или технология.
Если это больше, чем просто Transaction
Пожалуйста, объясните, как.
Редактировать 1
Ссылка на эту ссылку предложена в ответе @David Osborne.
Единица работы отслеживает все, что вы делаете во время бизнес-транзакции, которая может повлиять на базу данных. Когда вы закончите, он выяснит все, что нужно сделать, чтобы изменить базу данных в результате вашей работы.
Так это значит UnitOfWork
является DBTransaction
и многое другое
Ниже приведены дополнительные обязанности: -
Сохраняйте состояние того, что вы изменили, вставили, удалили в этом сеансе работы.
Основываясь на этом состоянии, измените базу данных, когда работа будет завершена.
Хотя это и не упомянуто в цитате выше, но оно также может контролировать пакетирование запросов.
Правильно ли мое понимание сейчас?
2 ответа
AFAIK возникает из-за необходимости в инструментах ORM для отслеживания состояния [постоянства] объектов во время логической / бизнес-транзакции.
То, как единица работы управляет этим, и его взаимосвязь с базовой технологией хранения и сохраняемыми объектами - это деталь реализации.
Транзакция базы данных с несколькими операторами SQL между ними, возможно, также является единицей работы. Однако, я полагаю, ключевое отличие состоит в том, что единица работы, как определено в шаблоне, абстрагирует этот уровень детализации до уровня объекта.
UnitOfWork
это бизнес транзакция Не обязательно техническая транзакция (транзакция БД), но часто привязанная к техническим транзакциям.
В шаблонах корпоративных приложений это определяется как
Поддерживает список объектов, затронутых бизнес-транзакцией, и координирует выписывание изменений и решение проблем параллелизма.
Он не определяет, как записываются изменения, ни тип хранилища.
Приложение может записать изменения в
- база данных с использованием SQL
- файловая система с использованием потоков
- постоянный сервис с использованием http запросов
- распределенный кеш или даже хранение в памяти с использованием вызовов методов
UnitOfWork
(бизнес-транзакция) собирает изменения бизнес-объектов и гарантирует, что другие бизнес-транзакции будут видеть только допустимые бизнес-объекты.
Например, когда ваше приложение выполняет сценарий использования, оно изменяет бизнес-объекты. Если две бизнес-транзакции (обычно сценарии использования) выполняются параллельно, ваше приложение должно позаботиться об изменениях, которые выполняет каждая бизнес-транзакция, и о времени, когда их увидят другие бизнес-транзакции.
Технически это часто делается с использованием транзакции БД. Таким образом, единицей работы обычно является дБ транзакция.
Приложения, которые используют ORM-каркасы для обработки персистентности, обычно имеют отношение один к одному между единицей слова и транзакцией db. Таким образом, разница между единицей работы и транзакцией в БД обычно не актуальна для разработчиков.