2010-07-20 62 views
0

我想要有一些类似于子交易的事情,因为您可以标记一个点,您可以开始子交易,然后在该位的决定点处,您可以回滚(中止子位)或进行有效的承诺,当出场转换承诺时。当然,如果您中止外部交易,标记位也会中止。如何管理子事务或嵌套事务?

我如何能做到这一点与NHibernate,但交易最前一页期间被关闭承诺,因此我真的有错误消息

没有打开的事务提交

我的代码如下:

API.Data.Session session = API.Data.SessionManager.GetSession(); 
     session.BeginTransaction(); 
     try 
     { 
      Project project = Project.Load(ID); 
      ........... 
      Save(project); 
      ..................... 

      session.CommitTransaction(); 
     } 
     catch 
     { 
      session.RollbackTransaction(); 
      throw; 
     } 

public void save(Project project) 
    { 
Data.SessionManager.GetSession().BeginTransaction(); 
       try 
       { 
        Save(); 
        LogIssueChange(test); 
        Data.SessionManager.GetSession().CommitTransaction(); 
       } 
       catch 
       { 
        Data.SessionManager.GetSession().RollbackTransaction(); 
        throw; 
       } 
    } 

回答

1

你不能,NHibernate不支持嵌套事务。您可以通过Systems.Transaction命名空间来实现此目的。


编辑:DeferableTransaction实现如下。我有这个作为ISession的扩展方法。这就是说,使用情况非常罕见。

扩展方法:

public static DeferableTransaction BeginOrDeferTransaction(this ISession session) 
    { 
     return new DeferableTransaction(session); 
    } 

    public static DeferableTransaction BeginOrDeferTransaction(this ISession session, IsolationLevel isolationLevel) 
    { 
     return new DeferableTransaction(session, isolationLevel); 
    } 

实现:

/// <summary> 
/// Begins a transaction or defers to an existing transaction. The IsolationLevel will not be changed 
/// on an existing transaction. 
/// </summary> 
public class DeferableTransaction : IDisposable 
{ 
    private readonly bool _ownedTransaction; 
    private readonly ITransaction _transaction; 

    public DeferableTransaction(ISession session) 
     : this(session, IsolationLevel.ReadCommitted) 
    {} 

    public DeferableTransaction(ISession session, IsolationLevel isolationLevel) 
    { 
     if (session.Transaction.IsActive) 
     { 
      _ownedTransaction = false; 
      _transaction = session.Transaction; 
     } 
     else 
     { 
      _ownedTransaction = true; 
      _transaction = session.BeginTransaction(isolationLevel); 
     } 
    } 

    public bool OwnedTransaction 
    { 
     get { return _ownedTransaction; } 
    } 

    public void CommitOrDefer() 
    { 
     if (_ownedTransaction) 
     { 
      _transaction.Commit(); 
     } 
    } 

    public void RollbackOrDefer() 
    { 
     if (_ownedTransaction) 
     { 
      _transaction.Rollback(); 
     } 
    } 

    public void Enlist(IDbCommand command) 
    { 
     _transaction.Enlist(command); 
    } 

    public bool IsActive 
    { 
     get { return _transaction.IsActive; } 
    } 

    public bool WasCommitted 
    { 
     get { return _transaction.WasCommitted; } 
    } 

    public bool WasRolledBack 
    { 
     get { return _transaction.WasRolledBack; } 
    } 

    public void Dispose() 
    { 
     if (_ownedTransaction) 
     { 
      _transaction.Dispose(); 
     } 
    } 
} 
+0

是不是还有其他方法?我不想直接与数据库交互 – learning 2010-07-20 10:16:35

+0

不,没有其他办法。我根本不用NHibernate中的存储库/服务方法来处理事务,以便多个存储库方法可以参与相同的事务。在分布式系统之外很少需要嵌套事务。我确实有一个名为DeferableTransaction的ISession扩展方法,它使用类似的语义,并允许事务遵从现有事务或启动一个新事务。如果你有兴趣,我会发布它。 – 2010-07-20 12:18:51

+0

不能说OP,但我会有兴趣看到你的impl – DanP 2010-07-20 14:28:02