【发布时间】:2010-05-14 17:07:00
【问题描述】:
Microsoft 在 tsql 中有以下 try...catch 示例:
USE AdventureWorks;
GO
-- SET XACT_ABORT ON will render the transaction uncommittable
-- when the constraint violation occurs.
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- A FOREIGN KEY constraint exists on this table. This
-- statement will generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
-- If the delete operation succeeds, commit the transaction. The CATCH
-- block will not execute.
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- Test XACT_STATE for 0, 1, or -1.
-- If 1, the transaction is committable.
-- If -1, the transaction is uncommittable and should
-- be rolled back.
-- XACT_STATE = 0 means there is no transaction and
-- a commit or rollback operation would generate an error.
-- Test whether the transaction is uncommittable.
IF (XACT_STATE()) = -1
BEGIN
PRINT 'The transaction is in an uncommittable state.' +
' Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
-- Test whether the transaction is active and valid.
IF (XACT_STATE()) = 1
BEGIN
PRINT 'The transaction is committable.' +
' Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH;
GO
以上示例来源:Using TRY...CATCH in Transact-SQL
我不明白您为什么要提交导致异常的事务。似乎 10 次中至少有 9 次想要 IF (XACT_STATE()) !=0 ROLLBACK TRANSACTION。您为什么希望在白手起家的情况下取得部分成功?
【问题讨论】:
-
我试图修剪一些 cmets 以使示例 sql 更短...但是当我尝试编辑代码时 SO 抛出异常。
标签: sql-server-2005 tsql