首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教事务这样写对不对呢

2013-08-01 
请问事务这样写对不对呢DECLARE @ErrorSum intSET @ErrorSum 0BEGIN TRANUPDATE XXXXXXXXXXXXXXXXXXSET

请问事务这样写对不对呢

   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

热点排行