2016-11-15 123 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刪除/更新行在技術上不是一個錯誤,但可能違反了商業規則。在這種情況下,您需要檢測代碼中的錯誤情況並提出錯誤。我會延長我的答案,包括這一點。 –