NHibernate, Get <TDto>(TId id) - отложенная транзакция начинается или нет? - PullRequest
0 голосов
/ 08 сентября 2018

Я новичок в NHibernate ... я должен когда-нибудь .BeginTransaction(), чтобы получить предмет?Без этого код бросает, однако с этим выглядит уродливо, так как никакой tx.Commit()/.CommitAsync() не вызван явно.Я полагаю, конец IDisposable подойдет?

 public override async Task<TDto> Get(int id)
    {
        using (var sessionBuilder = NHibernateConfiguration.Instance.BuildSessionFactory())
        using (var session = sessionBuilder.OpenSession())
        using (var tx = session.BeginTransaction())
        {
            return await session.GetAsync<TDto>(id);
        }
    }

1 Ответ

0 голосов
/ 08 сентября 2018

Рекомендуется , чтобы обернуть каждый вызов (индивидуальный или несколько вызовов) в транзакцию. Это помогает генерировать надежные результаты в случае многопоточной / многопроцессорной среды, когда другой поток / процесс изменяет данные, которые вы читаете. вызов также включает Чтение вызов.

Другая причина, по которой это рекомендуется, заключается в том, что современные СУБД всегда переносят каждый вызов в транзакции, если это еще не сделано. Это стоит. Лучше, если программист уже знает Единицу работы, эту стоимость можно сэкономить, а звонки можно сгруппировать гораздо лучше.

Но, в зависимости от сценария, это может быть необязательно для любого вызова (Создать, Читать, Обновить, Удалить). Это решение по каждому делу. Если вы избегаете этого по причине «код выглядит некрасиво», рассмотрите возможность реализации UoW.

Кстати, я надеюсь, что вы не звоните BuildSessionFactory для каждого звонка. Это дорого и, что более важно, не нужно. Вместо этого позвоните при запуске приложения.

В ответ на комментарий:

Я имею в виду то же, что упомянуто в комментарии "Оскара Берггрена"; это просто недостаточно ясно. Поскольку вопрос больше касается транзакции, а UoW - это больше, чем просто транзакция, я предпочел просто «упомянуть» UoW, а не вдаваться в детали.

Со ссылкой на первый абзац, «множественные вызовы» могут быть заключены в одну единицу работы. Пожалуйста, поймите, что UoW на больше , чем транзакция. При использовании ORM, такого как NHibernate, использование UoW значительно улучшает использование транзакций. Также обратите внимание, что с полной версией ORM вам не нужно делать слишком много для реализации UoW. ISession само по себе UoW. Вам просто нужно правильно управлять им.

Вам могут помочь следующие ответы:
https://stackoverflow.com/a/51781877/5779732
https://stackoverflow.com/a/50721461/5779732

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...