如何将TransactionScope与SQL Compact 4.0和NHibernate一起使用

时间:2011-11-14 20:35:52

标签: nhibernate transactions sql-server-ce transactionscope

我正在尝试将NHibernate与.NET的TransactionScope对象结合使用。到目前为止,我已成功使用Oracle 11g和SQL Server 2008R2,没有任何问题。但是,SQL Compact似乎不言自明。

using (var scope = new TransactionScope(TranactionScopeOption.Required))
{
    using (var session = _sessionFactory.OpenSession())
    {
        // The line below throws.  I also tried passing in System.Data.IsolationLevel.ReadCommitted to no avail
        using (var txn = session.BeginTransaction())
        {
            // Perform insert
            txn.Commit();
        }
    }
    scope.Complete();
}

这会导致以下异常。我理解这意味着什么,但我不明白为什么它试图创建一个嵌套的事务。

NHibernate.TransactionException: Begin failed with SQL exception ---> System.InvalidOperationException: SqlCeConnection does not support nested transactions.
   at System.Data.SqlServerCe.SqlCeConnection.BeginTransaction(IsolationLevel isolationLevel)
   at System.Data.SqlServerCe.SqlCeConnection.BeginDbTransaction(IsolationLevel isolationLevel)
   at System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction(IsolationLevel isolationLevel)
   at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
       at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)

2 个答案:

答案 0 :(得分:0)

您的代码可能产生2个交易:

1)new TransactionScope(TranactionScopeOption.Required)
2)session.BeginTransaction()

TransactionScope.Required“使用环境事务(如果已存在)。否则,它会在进入范围之前创建新事务。这是默认值”。保证在时间session.BeginTransaction()被点击时有环境事务,因此,使其成为嵌套事务。

如果未完成事务范围,则将回滚其范围内的所有内容。

答案 1 :(得分:0)

我认为答案就在于这个问题:The connection object can not be enlisted in transaction scope

“猜测,TransactionScope需要升级到分布式或嵌套式事务,CE都不支持这两种事务。”