2016-11-15 190 views
2

我有2个SQL Server语句。SQL Server事务

Delete from hello where id=1 

Insert into hello name,age 
select name ,age from welcome 

如果其中一个失败,则不应删除或插入。

我试图用交易

Begin Tran 

    Delete from hello where id=1 

    Insert into hello (name,age) 
    select name ,age from welcome 


Commit Tran 

但是,如果其中任何一个出了问题。其他一个是committed.Am我失去了一些东西。

2 delete statements 

BEGIN TRY 
    BEGIN TRAN; 


    delete from hello where id=1 

    delete from hello where id=19 // here id=19 doesn't exist 

    COMMIT TRAN; 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 ROLLBACK; 
    THROW; 
END CATCH; 

这里id = 19不存在,所以它应该回滚,但它是删除id = 1。它承诺,而不是rollback.What我应该在此之情况做..

+2

参见[用于SQLSERVER交易基本模板(http://stackoverflow.com/questions/290668/basic-template-for-transactions-in-sqlserver) –

+0

感谢有用信息亚历 – havin

回答

2

但是,如果其中任何一个出了问题。其他一个是committed.Am我丢失的东西 。

是的,你错过了错误处理。根据错误的不同,T-SQL批处理可能会在错误后继续并执行后续的语句,包括提交。下面是一个结构化的错误处理示例以避免这种情况

BEGIN TRY 
    BEGIN TRAN; 

    DELETE FROM hello WHERE id=1; 

    INSERT INTO hello (name,age) 
    SELECT name ,age FROM welcome; 

    COMMIT TRAN; 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 ROLLBACK; 
    THROW; 
END CATCH; 

UPDATE:

如果您有没有SQL服务器错误的其他业务规则,就可以检测出T-SQL代码的条件,引发错误调用CATCH块和回滚:

BEGIN TRY 
    BEGIN TRAN; 

    DELETE FROM hello WHERE id=1; 

    IF @@ROWCOUNT < 1 
    BEGIN 
     RAISERROR('Row not found', 16, 1); 
    END; 

    INSERT INTO hello (name,age) 
    SELECT name ,age FROM welcome; 

    COMMIT TRAN; 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 ROLLBACK; 
    THROW; 
END CATCH; 
+0

是我错过了错误处理..谢谢丹 – havin

+0

嗨,当我试着用2删除语句里面的错误处理它提交..我已经编辑它在我的问题..我应该怎么做在这个scenerio .. – havin

+1

@havin,no删除/更新行在技术上不是一个错误,但可能违反了商业规则。在这种情况下,您需要检测代码中的错误情况并提出错误。我会延长我的答案,包括这一点。 –