Reputation: 1455
I am getting the error "ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION". I am trying to rollback the transaction if the row count for any delete statement is zero. Given below is my code. What am I doing wrong? Please help
alter procedure delete_staff(@staffID varchar(10))
as
declare @tempvar varchar(50), @staffName varchar(50), @jobTitle varchar(50), @dept varchar(50)
begin transaction trans1
declare @rc1 int
declare @rc2 int
declare @rc3 int
select @tempvar = left(@staffID,1) from Staff
delete from staff where staffID = @staffID
set @rc1=@@rowcount
delete from Login where userID = @staffID
set @rc2=@@rowcount
begin
if(@tempvar='S')
begin
delete from Specialist where specialistID = @staffID
set @rc3=@@rowcount
end
else if(@tempvar='H')
begin
delete from Helpdesk_Operator where helpdesk_OperatorID = @staffID
set @rc3=@@rowcount
end
commit transaction trans1
end
if(@rc1=0 or @rc2=0 or @rc3=0)
begin
rollback transaction trans1
end
Upvotes: 6
Views: 30697
Reputation: 828
This happens if your transaction has already been committed before you actually go into your commit statement. You might give a condition 'If (@@TRANCOUNT>0)' before your 'COMMIT TRANSACTION' Statement.
For Eg:
BEGIN TRANSACTION
SELECT 0--Statements To Excecute
ROLLBACK
IF(@@TRANCOUNT>0)
COMMIT TRANSACTION
OR
BEGIN TRY
BEGIN TRANSACTION
SELECT 0 --Statements To Excecute
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF(@@TRANCOUNT>0)
ROLLBACK
END CATCH
Upvotes: 2
Reputation: 700152
If you commit the transaction, you can't then make a rollback. Do one or the other:
if(@rc1=0 or @rc2=0 or @rc3=0)
begin
rollback transaction trans1
end else begin
commit transaction trans1
end
Upvotes: 7
Reputation: 26048
I believe the commit transaction trans1
is always getting hit, therefore you will be unable to rollback from that point.
Upvotes: 1
Reputation: 1441
You have commit transaction trans1
right before your if statement for the rollback. The transaction will always be committed before you check the counts.
Upvotes: 4