Question

Suppose I have a stored procedure that manages its own transaction

CREATE PROCEDURE theProc
AS
BEGIN

  BEGIN TRANSACTION

-- do some stuff

  IF @ThereIsAProblem
    ROLLBACK TRANSACTION
  ELSE
    COMMIT TRANSACTION
END

If I call this proc from an existing transaction, the proc can ROLLBACK the external transaction.

BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION

How do I properly scope the transaction within the stored procedure, so that the stored procedure does not rollback external transactions?

Was it helpful?

Solution

The syntax to do this probably varies by database. But in Transact-SQL what you do is check @@TRANCOUNT to see if you are in a transaction. If you are then you want to create a savepoint, and at the end you can just pass through the end of the function (believing a commit or rollback will happen later) or else rollback to your savepoint.

See Microsoft's documentation on savepoints for more.

Support for savepoints is fairly widespread, but I think the mechanism (assuming there is one) for finding out that you're currently in a transaction will vary quite a bit.

OTHER TIPS

use @@trancount to see if you're already in a transaction when entering

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top