Как быть со вложенной транзакцией? ( NHibernate + SQL )
От: SteeLHeaD  
Дата: 17.06.13 18:04
Оценка:
Я использую в проектах nHibernate, и во многих местах у меня в коде встречаются конструкции типа


      using (ITransaction transaction = session.BeginTransaction())
      {
        try
        {
          ...
          transaction.Commit();
        }
        catch( exception ex )
    {
      transaction.Rollback();
    }
     }



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


SqlTransaction trans = cn.BeginTransaction();
try
{
...
trans.Commit();
}
catch
{
trans.Rollback();
}



и...
все сломалось.
Программа стала вылетать с ошибкой "could not instantiate test object:" и полным стек — трейсом NHibernat'овской ругани.

я понимаю, что где то в процессе вызова конструктора две транзакции стукаютсмя лбами, потому что Nhibernat'овская транзакция все равно опирается на SQL — ную.

Но как правильно выйти из этого положения?
спасибо за советы!
nhibernate sql транзакции
Re: Как быть со вложенной транзакцией? ( NHibernate + SQL )
От: TK Лес кывт.рф
Дата: 17.06.13 18:20
Оценка:
Здравствуйте, SteeLHeaD, Вы писали:

SLH>То есть это транзакция на уровне NHibernate — сессии.

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

Попробуйте использовать System.Transactions.Transaction
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Как быть со вложенной транзакцией? ( NHibernate + SQL )
От: SteeLHeaD  
Дата: 18.06.13 04:54
Оценка:
Здравствуйте, TK, Вы писали:

TK>Попробуйте использовать System.Transactions.Transaction


Спасибо за совет,
знакомство с System.Transactions было весьма поучительным и расширяющим кругозор.
Я честно говоря пока не въехал,
1) нужно ли мне ВСЕ транзакции в моей задаче
(то есть транзакцию верхнего уровня от nHibernate и "вложенную" SQL — транзакцию) заменить на System.Transactions?
2) И что понимать под заменой — как я понимаю, мне нужно мои объекты переписать так, чтобы они реализовывали интерфейс IEnlistmentNotification.
И тогда я вместо тех транзакций, с которыми возился и от которых получал по башке,
буду иметь дело с "правильной" транзакцией, которой я сам управляю?

Если будет минутка — можно мне ответить, будет полезно. А так — продолжаю читать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.