请问事务这样写对不对呢
DECLARE @ErrorSum int
SET @ErrorSum = 0
BEGIN TRAN
UPDATE XXXXXXXXXXXXXXXXXX
SET @ErrorSum=@ErrorSum+@@ERROR
UPDATE XXXXXXXXXXXXXXXXXX
SET @ErrorSum=@ErrorSum+@@ERROR
UPDATE XXXXXXXXXXXXXXXXXX
SET @ErrorSum=@ErrorSum+@@ERROR
IF (@ErrorSum<>0)
BEGIN
ROLLBACK TRAN
RETURN 0
END
ELSE
BEGIN
COMMIT TRAN
RETURN 1
END
[解决办法]
BEGIN TRANSACTION
BEGIN TRY
UPDATE CampaignCust
SET SaleNo = C.SaleNo
FROM CampaignCust A
INNER JOIN CampaignOffer B WITH(NOLOCK)
ON A.CampaignID = B.CampaignID and A.BrandCode = B.BrandCode and A.OfferID = B.OfferID
INNER JOIN SaleCoupon C WITH(NOLOCK)
ON A.BrandCode = C.BrandCode AND A.CouponNO = C.CouponNo
WHERE C.SaleNo IS NOT NULL
AND C.ModiDateTime > CAST(DATEADD(DD, -2, CAST(GETDATE() AS DATE)) AS DATETIME)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
SET @ErrorMessage = CONVERT (VARCHAR, ERROR_NUMBER ()) + CHAR (12) + ERROR_MESSAGE ()
SET @ErrorSeverity = ERROR_SEVERITY ()
SET @ErrorState = ERROR_STATE ()
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorCode, @ErrorParam1, @ErrorParam2);
END CATCH
[解决办法]
以下示例使用 TRY…CATCH 构造的 CATCH 块中的 XACT_STATE 来确定是提交事务还是回滚事务。由于 SET XACT_ABORT 设置为 ON,因此违反约束的错误将导致事务进入无法提交的状态。
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
[解决办法]
在2012中,微软终于增加了THROW语句
http://www.linuxidc.com/Linux/2012-09/70915.htm
[解决办法]
上面2位兄弟给出了比较大例子,你的写法没有try catch好,如果发生错误,你的写法程序捕获得到什么异常信息吗?如果只是返回0,1,那你知道DB发送了什么错误吗?
[解决办法]
写法2,适用于所有SQL2005及以上版本.
begin try
begin tran
UPDATE XXXXXXXXXXXXXXXXXX
UPDATE XXXXXXXXXXXXXXXXXX
UPDATE XXXXXXXXXXXXXXXXXX
commit tran
end try
begin catch
rollback tran
end catch