2010-11-25 4 views
1

asp.net MVC app이 약 일주일 정도 지난 다음이 오류가 발생했습니다.System.Transaction.TransactionScope에 활성 로컬 트랜잭션이 없기 때문에 "PROMOTE TRANSACTION 요청이 실패했습니다"메시지가 표시됩니다.

.net 4.0에서 실행 중, Win 2K8 R2는 Win 2K8 R2에서 SQL Server 2K8과 대화 중입니다.

모든 서버에는 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[]) 

코드 : 내가 SQL이
을 기반으로 ELMAH에 쓰는 마지막 캐치를하고 후에는 것을 알아 낸

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

범위가 완료되어 결코 작동하지 않을 것입니다. 그 버그를 수정했지만
오류가 왜 발생하는지 알려주지 않습니다.
scope.Complete() 문의 전후에 예외를 던졌습니다.
scope.Complete() 바로 앞에 의도적 인 오류가 발생했습니다. 페이지에 오류가없고 ELMAH 오류가 기록되지 않았습니다.
scope.Complete() 바로 다음에 의도적 인 오류가 발생했습니다. 범위를 얻는 것은 최종 catch에서 이미 오류가 완료된 것입니다.
나는 PROMOTE 시도가 일어나게 될 이유와 그것이 일어날 이유가 무엇인지 알 수 없었다.
사이트가 10 일 동안 정상적으로 실행되면이 오류가 발생하고 모든 사람들이 이후에 계정을 만들려고합니다. 데이터베이스의 다른 부분이 잘 작동하고 있지만. 이 기능은 SQL Server를 재부팅 할 때까지 엉망입니다. 로깅 호출에 대해 이렇게

+0

이것은 상당히 불쾌한 텍스트의 벽입니다. 조금이라도 감금하면 더 많은 반응을 얻을 수 있습니다. 또한이 작업을 수행 할 때 활성 트랜잭션이 있습니까? 어쩌면 게시물에 코드를 추가해야 할 것입니다. –

답변

3

봅니다 :

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

나는 로깅 호출 (당신이 당신의 오류 로거를 공격 할 때) 분산 트랜잭션을 촉진하기 위해 노력하고있다 생각합니다. 이 코드는 로깅 호출을 트랜잭션 밖으로 가져옵니다. 분산 작업을 할 때 로거에 대해 동일한 문제가있었습니다. 오류가 발생하고 실패한 다음 로그를 기록한 다음 범위를 종료하고 모든 것을 롤백합니다.

관련 문제