Я получаю сообщение "СОДЕЙСТВИЕ ПРОДВИЖЕНИЮ СДЕЛКИ", потому что нет локальной активной транзакции "в System.Transaction.TransactionScope - PullRequest
1 голос
/ 25 ноября 2010

У меня есть приложение asp.net MVC, которое работает около недели, а сегодня начало получать эту ошибку.

Работает в .net 4.0, Win 2K8 R2 общается с SQL Server 2K8 в Win 2K8 R2.

На всех серверах работает MS DTC.

Я делаю простое создание членства в aspnet, затем создаю дополнительные данные в моей собственной таблице пользователей внутри области действия.

Похоже, что как только один человек совершает ошибку, каждый получает ее, пытаясь после этого создать учетную запись. Другие функции базы данных работают.

Вот трассировка стека:

System.Transactions.TransactionAbortedException: The transaction has aborted. --->   System.Transactions.TransactionPromotionException: Failure while attempting to promote  transaction. ---> System.Data.SqlClient.SqlException: The PROMOTE TRANSACTION request failed because there is no local transaction active.  
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)  
   ...  
   at System.Data.SqlClient.SqlConnection.Open()  
   at Elmah.SqlErrorLog.Log(Error error) in c:\builds\ELMAH\src\Elmah\SqlErrorLog.cs:line 158  
   at KeyesTechnology.DemandLaunch.BusinessEntities.LoginAccount.CreateAccount() in c:\Products\DemandLaunch\Staging\KeyesTechnology\DemandLaunch\BusinessEntities  \LoginAccount.cs:line 141  
   at www.ViewModels.CreateAccountViewModel.Process() in c:\Products\DemandLaunch\Staging\mvc\www\ViewModels\CreateAccountViewModel.cs:line 89  
   at www.Controllers.AccountController.Create(CreateAccountViewModel model, String returnUrl) in c:\Products\DemandLaunch\Staging\mvc\www\Controllers\AccountController.cs:line 85  
   at lambda_method(Closure , ControllerBase , Object[] )  

Код:

using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope())
{
  try
  {
    //Create ASP.NET Membership User
    if (success)
    {
      //Create Domain Specific User Object
      // Forms Authenication call
    }
    else
    {
      throw Exception();
    }
    //Send Welcome Email
    //Subscribe to Email List

    scope.Complete();
  }
  catch(Exception exc)
  {
    Elmah.Error error = new Elmah.Error(exc, HttpContext.Current);
    Elmah.ErrorLog log = Elmah.ErrorLog.GetDefault(HttpContext.Current);
    log.Log(error);  //Error throws on this line

    result = false;
  }
}

Я выяснил, что у меня последний улов, пишущий в ELMAH, основанный на SQL
и это после завершения объема, поэтому он никогда не будет работать. Я исправил эту ошибку, но
это не говорит мне, почему происходит ошибка.
Для тестирования я бросил исключения прямо перед и после оператора scope.Complete ()
Я сделал преднамеренную ошибку непосредственно перед областью действия. Complete (). Я не получаю ошибки на странице и не регистрируется ошибка ELMAH.
Я сделал преднамеренную ошибку сразу после scope.Complete (). Я получаю область уже завершена ошибка в окончательном улове, то.
Я не смог понять, что может заставить ПРОДВИНУТЬСЯ попытаться произойти и почему это произойдет, если это так.
Сайт работал нормально в течение 10 дней, затем мы получаем эту ошибку, и каждый потом получает ее, пытаясь создать учетную запись. Хотя остальные части базы работают нормально. Просто эта функция не работает до тех пор, пока мы не перезагрузим SQL Server.

1 Ответ

3 голосов
/ 26 ноября 2010

Попробуйте сделать это для своего звонка в журнале:

using(TransactionScope scope 
    = new TransactionScope(TransactionScopeOption.Suppress))
{
    log.Log(error);  //Error throws on this line
}

Я думаю, что ваш звонок в журнале пытается перейти к распределенной транзакции (когда вы пытаетесь нажать на журнал ошибок).Этот код выведет вызов регистрации из транзакции.У меня была такая же проблема для регистратора при выполнении распределенной работы.Я получил бы ошибку, потерпел бы неудачу и затем зарегистрировал бы, который тогда выйдет из области и откатит все.

...