0

У нас есть решение C#, в котором мы применили шаблон сценария транзакции; его слои следующие:Сценарий транзакции и блок работы

  • Адаптер: точка доступа к приложению (потребляется контроллерами MVC и контроллерами API); allways вызывает только один метод из уровня Logic;
  • Логика: методы с бизнес-логикой; внутри каждого метода мы могли бы иметь несколько вызовов других методов логики/репозитория;
  • доступа к данным: методы с вызовами NHibernate и/или NPGSQL (для дорогостоящих операций, требующих хранимых процедур)

Теперь мы хотим реализовать единицы работы шаблона с помощью TransactionScope использовать один и только одна сделка по запрос (т. е. одна транзакция за вызов методов из Adapter, поскольку мы используем UoW на уровне Adapter), но мы не можем понять, как управлять соединениями, поскольку у нас могут быть соединения для NHibernate и/или NPGSQL внутри одного и того же метода ,

С уважением

+0

Вы видели [это] (/ д/646318/1178314), и [это] (/ д/5187860/1178314)? –

ответ

0

Я немного запутался ... это звучит, как вы используете одну базу данных, но нет никаких причин, чтобы иметь отдельное соединение с базой данных для обхода NHibernate. Просто используйте тот же самый.

Использование нескольких соединений потребует распределенных транзакций для обеспечения правильности, и это всегда проще и эффективнее, если этого можно избежать.

Пример:

// Inside transaction... 
{ 
    // Apologies if I didn't get the class name correct in cast. 
    var conn = (NpgsqlConnection)session.Connection; 
    conn.SomeDirectCall(). 
} 

В зависимости от того, что ваши точные потребности, вы можете даже не нужен бросок.

Единственная причина, по которой использовать отдельное соединение, должна быть, если вы явно хотите, чтобы AVOID выполнял все это в одной транзакции.

0

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

enter image description here

Смежные вопросы