2011-06-22 1 views
1

а моей проблемы: У меня есть метод, как:Откат транзакции в хранилище из другого класса

class Manager 
{ 
    void method1() 
    { 
     // save object in database to get ID 
     int newId = this.Repository.Save(obj); 

     try { 
      // call remote webservice to save another object with same ID as in local DB 
      webservice.Save(remoteObj, id); 
     } 
     catch(Exception e) 
     { 
      // do Rollback in Repository here 
     } 
    } 
} 

Bassically это код. Репозиторий использует NHibernate для сохранения в БД. Мне нужно сохранить в БД, чтобы узнать новый идентификатор, а затем отправить этот идентификатор в webservice. Если что-то не вызвало вызов webservice, я хочу откат и отбросить сохраненный объект .... и вот моя проблема. Я не могу открыть и контролировать транзакцию в репозитории из моего диспетчера классов.

Я уже попробовать с этим также:

class Manager 
{ 
    void method1() 
    { 
     using (TransactionScope scope = new TransactionScope()) 
     { 
      // save object in database to get ID 
      int newId = this.Repository.Save(obj); 

      // call remote webservice to save another object with same ID 
      // as in local DB 
      webservice.Save(remoteObj, id); 
      scope.Complete(); 
     } 
    } 
} 

Здесь проблема в том, что откат в порядке, но не Сохранить (Создать в NHibernate). Я получаю ошибку об этом объекте «Транзакция» не найден или транзакция уже закрыта сразу после строки: «scope.Complete();».

Я думаю, что что-то не так пытается контролировать транзакцию NHibernate с TransactionScope.

Я не знаю, если проблема с подходом, возможно, для справки этой ситуации нужно использовать другой способ ... ??

любая помощь или идея, где найти ??

Большое спасибо!

+0

вы могли бы разместить код в хранилище? –

ответ

0

Предполагая, что вы уже открыли сессию в CurrentSession собственности/переменной, и что вы могли бы передать, что работа сессии в репозиторий, я хотел бы сделать следующее:

using(var trx = CurrentSession.BeginTransaction()) 
{ 
    try 
    { 
     int newId = this.Repository.Save(obj, CurrentSession); 
     webservice.Save(remoteObj, id); 

     trx.Commit(); 
    } 
    catch 
    { 
     trx.Rollback(); 
    } 
} 
Смежные вопросы