2011-06-22 71 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保存到數據庫。我需要保存在數據庫中以瞭解新ID,然後將此ID發送到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的)。我得到有關該對象的錯誤「Transaction」未找到,或者事務已經在行後面關閉:「scope.Complete();」。

我認爲嘗試使用TransactionScope控制NHibernate事務是錯誤的。

我不知道如果是關於方法的問題,也許應該用另一種方式來處理這種情況...... ??

任何幫助或想法在哪裏可以找到?

非常感謝!

+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(); 
    } 
}