Является ли UnitOfWork равной Транзакции? Или это больше, чем это?

Интернет полон информации о UnitOfWork шаблон; даже ТАК не исключение.

Я до сих пор не понимаю что-то об этом. В моем понимании UnitOfWork = Transaction in DB, Это все; ни больше ни меньше.

Это правильно?

Мое замешательство связано с тем, как это реализовано в разных ORMs. NHibernate использования ISession больше, чем просто Transaction, Dapper оставляет все тебе.

Мой вопрос здесь о шаблоне дизайна только без учета каких-либо ORM или технология.

Если это больше, чем просто TransactionПожалуйста, объясните, как.

Редактировать 1

Ссылка на эту ссылку предложена в ответе @David Osborne.

Единица работы отслеживает все, что вы делаете во время бизнес-транзакции, которая может повлиять на базу данных. Когда вы закончите, он выяснит все, что нужно сделать, чтобы изменить базу данных в результате вашей работы.

Так это значит UnitOfWork является DBTransaction и многое другое

Ниже приведены дополнительные обязанности: -

  • Сохраняйте состояние того, что вы изменили, вставили, удалили в этом сеансе работы.

  • Основываясь на этом состоянии, измените базу данных, когда работа будет завершена.

Хотя это и не упомянуто в цитате выше, но оно также может контролировать пакетирование запросов.

Правильно ли мое понимание сейчас?

2 ответа

Решение

AFAIK возникает из-за необходимости в инструментах ORM для отслеживания состояния [постоянства] объектов во время логической / бизнес-транзакции.

То, как единица работы управляет этим, и его взаимосвязь с базовой технологией хранения и сохраняемыми объектами - это деталь реализации.

Транзакция базы данных с несколькими операторами SQL между ними, возможно, также является единицей работы. Однако, я полагаю, ключевое отличие состоит в том, что единица работы, как определено в шаблоне, абстрагирует этот уровень детализации до уровня объекта.

UnitOfWork это бизнес транзакция Не обязательно техническая транзакция (транзакция БД), но часто привязанная к техническим транзакциям.

В шаблонах корпоративных приложений это определяется как

Поддерживает список объектов, затронутых бизнес-транзакцией, и координирует выписывание изменений и решение проблем параллелизма.

Он не определяет, как записываются изменения, ни тип хранилища.

Приложение может записать изменения в

  • база данных с использованием SQL
  • файловая система с использованием потоков
  • постоянный сервис с использованием http запросов
  • распределенный кеш или даже хранение в памяти с использованием вызовов методов

UnitOfWork (бизнес-транзакция) собирает изменения бизнес-объектов и гарантирует, что другие бизнес-транзакции будут видеть только допустимые бизнес-объекты.

Например, когда ваше приложение выполняет сценарий использования, оно изменяет бизнес-объекты. Если две бизнес-транзакции (обычно сценарии использования) выполняются параллельно, ваше приложение должно позаботиться об изменениях, которые выполняет каждая бизнес-транзакция, и о времени, когда их увидят другие бизнес-транзакции.

Технически это часто делается с использованием транзакции БД. Таким образом, единицей работы обычно является дБ транзакция.

Приложения, которые используют ORM-каркасы для обработки персистентности, обычно имеют отношение один к одному между единицей слова и транзакцией db. Таким образом, разница между единицей работы и транзакцией в БД обычно не актуальна для разработчиков.

Другие вопросы по тегам