2011-10-27 5 views
1

우리는 표준 SqlMembershipProvider를 사용하는 작은 웹 사이트를 실행하며 표준 CreateUserWizard가 있습니다. 잠금 리소스를 다른 프로세스에 교착트랜잭션 교착 상태 SqlMembershipProvider.CreateUser()

트랜잭션 (프로세스 ID XX) 및 교착 상태로 선택되었습니다

우리는 처리되지 않은 예외를 얻었다. 트랜잭션을 재실행하십시오.

스택 추적

System.Web.Security.SqlMembershipProvider이다. createuser가

System.Web.UI.WebControls.CreateUserWizard (문자열 이름, 문자열 암호, 문자열 이메일은 문자열 passwordQuestion, 문자열 passwordAnswer, 부울 isApproved는 providerUserKey, MembershipCreateStatus & 상태 개체). AttemptCreateUser()

어떤 문제를 해결하는 방법?

ALTER PROCEDURE [dbo].[aspnet_Membership_CreateUser] 
    @ApplicationName      nvarchar(256), 
    @UserName        nvarchar(256), 
    @Password        nvarchar(128), 
    @PasswordSalt       nvarchar(128), 
    @Email         nvarchar(256), 
    @PasswordQuestion      nvarchar(256), 
    @PasswordAnswer       nvarchar(128), 
    @IsApproved        bit, 
    @CurrentTimeUtc       datetime, 
    @CreateDate        datetime = NULL, 
    @UniqueEmail       int  = 0, 
    @PasswordFormat       int  = 0, 
    @UserId         uniqueidentifier OUTPUT 
AS 
BEGIN 
    DECLARE @ApplicationId uniqueidentifier 
    SELECT @ApplicationId = NULL 

    DECLARE @NewUserId uniqueidentifier 
    SELECT @NewUserId = NULL 

    DECLARE @IsLockedOut bit 
    SET @IsLockedOut = 0 

    DECLARE @LastLockoutDate datetime 
    SET @LastLockoutDate = CONVERT(datetime, '17540101', 112) 

    DECLARE @FailedPasswordAttemptCount int 
    SET @FailedPasswordAttemptCount = 0 

    DECLARE @FailedPasswordAttemptWindowStart datetime 
    SET @FailedPasswordAttemptWindowStart = CONVERT(datetime, '17540101', 112) 

    DECLARE @FailedPasswordAnswerAttemptCount int 
    SET @FailedPasswordAnswerAttemptCount = 0 

    DECLARE @FailedPasswordAnswerAttemptWindowStart datetime 
    SET @FailedPasswordAnswerAttemptWindowStart = CONVERT(datetime, '17540101', 112) 

    DECLARE @NewUserCreated bit 
    DECLARE @ReturnValue int 
    SET @ReturnValue = 0 

    DECLARE @ErrorCode  int 
    SET @ErrorCode = 0 

    DECLARE @TranStarted bit 
    SET @TranStarted = 0 

    IF(@@TRANCOUNT = 0) 
    BEGIN 
     BEGIN TRANSACTION 
     SET @TranStarted = 1 
    END 
    ELSE 
     SET @TranStarted = 0 

    EXEC dbo.aspnet_Applications_CreateApplication @ApplicationName, @ApplicationId OUTPUT 

    IF(@@ERROR <> 0) 
    BEGIN 
     SET @ErrorCode = -1 
     GOTO Cleanup 
    END 

    SET @CreateDate = @CurrentTimeUtc 

    SELECT @NewUserId = UserId FROM dbo.aspnet_Users WHERE LOWER(@UserName) = LoweredUserName AND @ApplicationId = ApplicationId 
    IF (@NewUserId IS NULL) 
    BEGIN 
     SET @NewUserId = @UserId 
     EXEC @ReturnValue = dbo.aspnet_Users_CreateUser @ApplicationId, @UserName, 0, @CreateDate, @NewUserId OUTPUT 
     SET @NewUserCreated = 1 
    END 
    ELSE 
    BEGIN 
     SET @NewUserCreated = 0 
     IF(@NewUserId <> @UserId AND @UserId IS NOT NULL) 
     BEGIN 
      SET @ErrorCode = 6 
      GOTO Cleanup 
     END 
    END 

    IF(@@ERROR <> 0) 
    BEGIN 
     SET @ErrorCode = -1 
     GOTO Cleanup 
    END 

    IF(@ReturnValue = -1) 
    BEGIN 
     SET @ErrorCode = 10 
     GOTO Cleanup 
    END 

    IF (EXISTS (SELECT UserId 
        FROM dbo.aspnet_Membership 
        WHERE @NewUserId = UserId)) 
    BEGIN 
     SET @ErrorCode = 6 
     GOTO Cleanup 
    END 

    SET @UserId = @NewUserId 

    IF (@UniqueEmail = 1) 
    BEGIN 
     IF (EXISTS (SELECT * 
        FROM dbo.aspnet_Membership m WITH (UPDLOCK, HOLDLOCK) 
        WHERE ApplicationId = @ApplicationId AND LoweredEmail = LOWER(@Email))) 
     BEGIN 
      SET @ErrorCode = 7 
      GOTO Cleanup 
     END 
    END 

    IF (@NewUserCreated = 0) 
    BEGIN 
     UPDATE dbo.aspnet_Users 
     SET LastActivityDate = @CreateDate 
     WHERE @UserId = UserId 
     IF(@@ERROR <> 0) 
     BEGIN 
      SET @ErrorCode = -1 
      GOTO Cleanup 
     END 
    END 

    INSERT INTO dbo.aspnet_Membership 
       (ApplicationId, 
        UserId, 
        Password, 
        PasswordSalt, 
        Email, 
        LoweredEmail, 
        PasswordQuestion, 
        PasswordAnswer, 
        PasswordFormat, 
        IsApproved, 
        IsLockedOut, 
        CreateDate, 
        LastLoginDate, 
        LastPasswordChangedDate, 
        LastLockoutDate, 
        FailedPasswordAttemptCount, 
        FailedPasswordAttemptWindowStart, 
        FailedPasswordAnswerAttemptCount, 
        FailedPasswordAnswerAttemptWindowStart) 
     VALUES (@ApplicationId, 
        @UserId, 
        @Password, 
        @PasswordSalt, 
        @Email, 
        LOWER(@Email), 
        @PasswordQuestion, 
        @PasswordAnswer, 
        @PasswordFormat, 
        @IsApproved, 
        @IsLockedOut, 
        @CreateDate, 
        @CreateDate, 
        @CreateDate, 
        @LastLockoutDate, 
        @FailedPasswordAttemptCount, 
        @FailedPasswordAttemptWindowStart, 
        @FailedPasswordAnswerAttemptCount, 
        @FailedPasswordAnswerAttemptWindowStart) 

    IF(@@ERROR <> 0) 
    BEGIN 
     SET @ErrorCode = -1 
     GOTO Cleanup 
    END 

    IF(@TranStarted = 1) 
    BEGIN 
     SET @TranStarted = 0 
     COMMIT TRANSACTION 
    END 

    RETURN 0 

Cleanup: 

    IF(@TranStarted = 1) 
    BEGIN 
     SET @TranStarted = 0 
     ROLLBACK TRANSACTION 
    END 

    RETURN @ErrorCode 

END 

감사 :

이 SQL 쿼리는 표준 것입니다!

+0

트랜잭션 교착 상태는 리소스에 대한 많은 경쟁이 예상되지 않는 "작은 웹 사이트"에서는 일반적이지 않습니다. 이 게시물이 직면하고있는 문제에 대해 더 많은 것을 밝힐 수 있는지 확인하십시오. http://social.msdn.microsoft.com/forums/en-US/sqldatabaseengine/thread/e0210b4f-61c4-41f3-a573-c5fe7ac33b5e –

+0

리소스 경쟁 내 의견으로는 트래픽과 관련이 없지만 프로그래밍 된 웹 페이지가 얼마나 심한가. 스레드가 말하는 그래픽을 얻으려고합니다. – BCartolo

답변

1

누군가가 SQL Server Management Studio에서 편집 모드 (예 : 테이블 잠금)로 테이블을 열었습니까?

+0

아니요. 어쨌든 답장을 보내 주셔서 감사합니다. – BCartolo

0

@UserId를 새 GUID로 설정하기 만하면 작동합니다.

set @User = NEWID();