I have used transaction with try-catch block in my procedure. If any exception occurs, I am rolling back the transaction and after that trying to update a Results (Status) table. But, it looks like the Update statement is locking table (The Select query on that table is not working after that).
Could you please let me know what is the reason of this behavior?
Here, is my sample code:
ALTER PROCEDURE Test_Tran AS BEGIN BEGIN TRY BEGIN TRANSACTION SAVE TRANSACTION T1; SELECT 1 / 0; COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION T1; UPDATE [DI].[BOMLC_AMPL_DI_Async_Exec_Results] SET [End_Time] = GETDATE(), [Execution_Status] = 'FAILED', [Error_Number] = 16, [Error_Message] = 'Exception occurred while processing: ' + ERROR_MESSAGE(), [Last_Updated_On] = GETDATE() WHERE [Token_ID] = 52; PRINT('Something went wrong'); END CATCH END GO EXEC Test_Tran;
Advertisement
Answer
Add COMMIT
or ROLLBACK
after UPDATE
statement. Or do ROLLBACK TRANSACTION
instead of ROLLBACK TRANSACTION T1
.
Explanation:
The savepoint causes the problem. When an error occurs, you are rolling back to the savepoint, but the transaction is still open. You also get an error on trancount mismatch. The update is done within a transaction which is never committed hence the locking. When the procedure ends, the transaction is still open.