Reputation: 69
When I executed this stored procedure, I cannot rollback in IF
block even the IF
statement was right. If the IF
statement was right, script still running in the end and there is no rollback at all.
The message: The account id has already used successful register
Msg 3902, Level 16, State 1, Procedure PROC_DANGKY, Line 23
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.
Code:
CREATE PROCEDURE PROC_REGISTER
@name nvarchar(30),
@birth datetime,
@passport nvarchar(9),
@address nvarchar(50),
@phone nvarchar(11),
@email nvarchar(20),
@account nvarchar(30),
@password nvarchar(20)
AS
BEGIN TRAN
BEGIN TRY
IF (EXISTS(SELECT * FROM CUSTOMER WHERE ACCOUNT = @account))
BEGIN
PRINT N'The account id has already been used'
ROLLBACK TRAN
END
INSERT INTO KHACHHANG
VALUES (@name, @birth, @passport, @address, @phone, @email, @account, @password)
PRINT N'Successfully registered'
END TRY
BEGIN CATCH
DECLARE @ErrorMsg VARCHAR(2000)
SELECT @ErrorMsg = N'Error: ' + ERROR_MESSAGE()
RAISERROR(@ErrorMsg, 16,1)
ROLLBACK TRAN
RETURN
END CATCH
COMMIT TRAN
Upvotes: 1
Views: 1541
Reputation: 24913
You can check @@TRANCOUNT before rollback to ckeck if transaction exists:
CREATE PROC PROC_REGISTER
@name nvarchar(30),
@birth datetime,
@passport nvarchar(9),
@address nvarchar(50),
@phone nvarchar(11),
@email nvarchar(20),
@account nvarchar(30),
@password nvarchar(20)
AS
BEGIN TRAN
BEGIN TRY
IF (EXISTS(SELECT * FROM CUSTOMER WHERE ACCOUNT = @account))
BEGIN
PRINT N'The account id has already used'
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRAN
END
END
INSERT INTO KHACHHANG VALUES (@name, @birth, @passport, @address, @phone, @email, @account, @password)
PRINT N'Successul register'
END TRY
BEGIN CATCH
DECLARE @ErrorMsg VARCHAR(2000)
SELECT @ErrorMsg = N'Error: ' + ERROR_MESSAGE()
RAISERROR(@ErrorMsg, 16,1)
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRAN
END
RETURN
END CATCH
COMMIT TRAN
Upvotes: 0
Reputation: 4824
REFORMATTED your query
Removed rollback after exists
CREATE PROC PROC_REGISTER
@name nvarchar(30),
@birth datetime,
@passport nvarchar(9),
@address nvarchar(50),
@phone nvarchar(11),
@email nvarchar(20),
@account nvarchar(30),
@password nvarchar(20)
AS
BEGIN TRAN
BEGIN TRY
IF (EXISTS(SELECT * FROM CUSTOMER WHERE ACCOUNT = @account))
PRINT N'The account id has already used'
ELSE
BEGIN
INSERT INTO KHACHHANG VALUES (@name, @birth, @passport, @address, @phone, @email, @account, @password)
PRINT N'Successul register'
END
END TRY
BEGIN CATCH
DECLARE @ErrorMsg VARCHAR(2000)
SELECT @ErrorMsg = N'Error: ' + ERROR_MESSAGE()
RAISERROR(@ErrorMsg, 16,1)
IF @@TRANCOUNT > 0
ROLLBACK TRAN
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRAN
GO
RETURN
Upvotes: 1