April 18, 2010 at 4:07 pm
The following extract is from http://msdn.microsoft.com/en-us/library/ms175976.aspx
>>>
USE AdventureWorks;
GO
BEGIN TRANSACTION;
BEGIN TRY
...
END TRY
BEGIN CATCH
...
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
>>>
Shouldn't the
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
test occur after BEGIN TRANSACTION but just before the "BEGIN CATCH?
TIA,
Barkingdog
April 18, 2010 at 4:40 pm
Barkingdog (4/18/2010)
The following extract is from http://msdn.microsoft.com/en-us/library/ms175976.aspx...
Shouldn't the
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
test occur after BEGIN TRANSACTION but just before the "BEGIN CATCH?
No, the idea here is that you start a transaction, do some work and if an error occurs (the catch section) , you roll back the transaction.
Then, after the try...catch you check to see if the transaction has been rolled back or not - if it has not, you commit.
(the only reason there would not be an active transaction at this point would be if the "catch" had been triggered and the rollback had happened.)
Does that help?
MM
select geometry::STGeomFromWKB(0x0106000000020000000103000000010000000B0000001000000000000840000000000000003DD8CCCCCCCCCC0840000000000000003DD8CCCCCCCCCC08408014AE47E17AFC3F040000000000104000CDCCCCCCCCEC3F9C999999999913408014AE47E17AFC3F9C99999999991340000000000000003D0000000000001440000000000000003D000000000000144000000000000000400400000000001040000000000000F03F100000000000084000000000000000401000000000000840000000000000003D0103000000010000000B000000000000000000143D000000000000003D009E99999999B93F000000000000003D009E99999999B93F8014AE47E17AFC3F400000000000F03F00CDCCCCCCCCEC3FA06666666666FE3F8014AE47E17AFC3FA06666666666FE3F000000000000003D1800000000000040000000000000003D18000000000000400000000000000040400000000000F03F000000000000F03F000000000000143D0000000000000040000000000000143D000000000000003D, 0);
April 18, 2010 at 5:03 pm
That was helpful.
Would this interpretation of the original code be correct?
>>>
USE AdventureWorks;
GO
BEGIN TRANSACTION;
BEGIN TRY
...
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
...
END CATCH
TIA,
barkingdog
April 18, 2010 at 5:05 pm
Yes, that should be functionally the same.
MM
select geometry::STGeomFromWKB(0x0106000000020000000103000000010000000B0000001000000000000840000000000000003DD8CCCCCCCCCC0840000000000000003DD8CCCCCCCCCC08408014AE47E17AFC3F040000000000104000CDCCCCCCCCEC3F9C999999999913408014AE47E17AFC3F9C99999999991340000000000000003D0000000000001440000000000000003D000000000000144000000000000000400400000000001040000000000000F03F100000000000084000000000000000401000000000000840000000000000003D0103000000010000000B000000000000000000143D000000000000003D009E99999999B93F000000000000003D009E99999999B93F8014AE47E17AFC3F400000000000F03F00CDCCCCCCCCEC3FA06666666666FE3F8014AE47E17AFC3FA06666666666FE3F000000000000003D1800000000000040000000000000003D18000000000000400000000000000040400000000000F03F000000000000F03F000000000000143D0000000000000040000000000000143D000000000000003D, 0);
April 18, 2010 at 8:23 pm
Barkingdog (4/18/2010)
That was helpful.Would this interpretation of the original code be correct?
No, the ROLLBACK TRANSACTION would fail if the error had already caused the transaction to abort.
Use XACT_ABORT() rather than @@TRANCOUNT to check the status of any open transaction.
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi
April 19, 2010 at 11:36 am
Paul White NZ (4/18/2010)
Barkingdog (4/18/2010)
That was helpful.Would this interpretation of the original code be correct?
No, the ROLLBACK TRANSACTION would fail if the error had already caused the transaction to abort.
Use XACT_ABORT() rather than @@TRANCOUNT to check the status of any open transaction.
It's a good point - I was assuming the tests for an active transaction had been removed for brevity, not on purpose...
MM
select geometry::STGeomFromWKB(0x0106000000020000000103000000010000000B0000001000000000000840000000000000003DD8CCCCCCCCCC0840000000000000003DD8CCCCCCCCCC08408014AE47E17AFC3F040000000000104000CDCCCCCCCCEC3F9C999999999913408014AE47E17AFC3F9C99999999991340000000000000003D0000000000001440000000000000003D000000000000144000000000000000400400000000001040000000000000F03F100000000000084000000000000000401000000000000840000000000000003D0103000000010000000B000000000000000000143D000000000000003D009E99999999B93F000000000000003D009E99999999B93F8014AE47E17AFC3F400000000000F03F00CDCCCCCCCCEC3FA06666666666FE3F8014AE47E17AFC3FA06666666666FE3F000000000000003D1800000000000040000000000000003D18000000000000400000000000000040400000000000F03F000000000000F03F000000000000143D0000000000000040000000000000143D000000000000003D, 0);
April 19, 2010 at 11:53 pm
mister.magoo (4/19/2010)
It's a good point - I was assuming the tests for an active transaction had been removed for brevity, not on purpose...
And you were probably right! Just making sure (and mentioning the XACT_STATE function).
Paul White
SQLPerformance.com
SQLkiwi blog
@SQL_Kiwi
Viewing 7 posts - 1 through 6 (of 6 total)
You must be logged in to reply to this topic. Login to reply