从另一个类回滚Repository中的事务

时间:2011-06-22 18:34:30

标签: nhibernate transactions transactionscope

我的问题是: 我有一个方法:

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保存到DB。我需要保存在DB中以了解新ID,然后将此ID发送到webservice。如果调用webservice失败了,我想回滚并丢弃保存的对象....这是我的问题。我无法从类Manager中打开并控制Repository中的事务。

我也尝试过这个:

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

这里的问题是回滚是OK但不是Save(在NHibernate中创建)。我得到关于该对象的错误“事务”未找到或事务已在行之后关闭:“scope.Complete();”。

我认为尝试使用TransactionScope控制NHibernate事务是错误的。

我不知道是否是关于进场的问题,也许应该采用另一种方式来处理这种情况...... ??

任何帮助或想法在哪里找到??

非常感谢!!

1 个答案:

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