2016-11-15 1 views
2

У меня есть 2 SQL-сервера.SQL Server Transaction

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 я должен делать в этом Scenerio ..

+2

См [Базовый шаблон для операций в SQLServer] (http://stackoverflow.com/questions/290668/basic-template-for-transactions-in-sqlserver) –

+0

Спасибо за полезную информацию Alex – 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

Привет, когда я попробовал с двумя операциями удаления внутри обработки ошибок, он зафиксирован. Я редактировал его в своем вопросе. Что я должен делать в этом scenerio .. – havin

+1

@havin, no строки, удаленные/обновленные, технически не являются ошибкой, но, возможно, являются нарушением бизнес-правил. В этом случае вам необходимо обнаружить условие ошибки в коде и поднять ошибку. Я продолжу свой ответ, чтобы включить это. –