Как я могу использовать TransactionScope с SQL Compact 4.0 и NHibernate - PullRequest
2 голосов
/ 15 ноября 2011

Я пытаюсь использовать 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 голосов
/ 29 января 2014

Я думаю, что ответ заключается в следующем вопросе: Объект соединения не может быть зачислен в область транзакции

"По предположению TransactionScope необходимо перейти к распределенной или вложенной транзакции,ни один из которых не поддерживается CE. "

0 голосов
/ 15 ноября 2011

Ваш код потенциально производит 2 транзакции:

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

TransactionScope.Required "использует внешнюю транзакцию, если она уже существует. В противном случае он создает новую транзакцию перед входом в область. Это значение по умолчанию",Вы гарантированно получите внешнюю транзакцию к тому моменту, когда ударится session.BeginTransaction(), что сделает ее вложенной.

Если область транзакции не будет завершена, все в ее области будет откатано.

...