2013-09-03 3 views
-1

У меня есть следующий запрос:Отката в SQL

use valid 
begin transaction t1 
go 
delete from dbo.do 
rollback transaction t1 
go 

С откатом Я хочу, чтобы отменить операцию удаления. Не получайте никаких результатов, что не так?

+2

Определение «результатов» , если вы не используете предложение OUTPUT, вы не получаете результат от DELETE. –

+0

@ пользователь2645263 какой выход вы ожидаете ?? – Dhaval

ответ

2

Попробуйте без «идти» после начала транзакции.

+0

Это пакетный разделитель, используемый клиентскими инструментами (например, SSMS) для разбивки всего скрипта на партии. Я не думаю, что это имеет отношение к транзакции. –

0

Ваш запрос выглядит нормально в первом взгляде, и он должен работать без каких-либо проблем. Я пробовал подобный пример код, как показано ниже, и она отлично работает:

use [replocal] 
    begin transaction t1 
    go 
    delete from dbo.ftpfilelog 
    rollback transaction t1 
    go 
    select * from dbo.ftpfilelog 

Но если у Вас есть какие-либо другие вопросы после ВЕЯТ и бросил ошибку и никогда не достигал ROLLBACK Постулатов в том случае, если ваши ряды ушли ,

Вам лучше использовать TRY..CATCH и поместить свой ROLLBACK в CATCH. Он будет всегда откатываться, если есть какая-либо ошибка.

0

вы можете использовать безопасный и простой код для запуска 100% (запустить все строки запроса) или не бежать от них какой-либо

  • | запрос 1 | = как вставить в или выбрать или ...
  • | количество линий | = Число от запроса
DECLARE @rowcount int set @rowcount = 0 ; 
    BEGIN TRANSACTION [Tran1] 
    BEGIN TRY 
    <Query 1> ; set @rowcount = (@rowcount + @@ROWCOUNT); 
    <Query 2> ; set @rowcount = (@rowcount + @@ROWCOUNT); 
    ... 
    IF @rowcount = <count of lines> 
     COMMIT TRANSACTION[Tran1] 
    ELSE 
     ROLLBACK TRANSACTION[Tran1] 
    END TRY 
     BEGIN CATCH 
     ROLLBACK TRANSACTION[Tran1] 
    END CATCH 

, например, этот код запуска 2 вставки в строке запроса, но и выполнять все его или не запускать ничего и откатить

DECLARE @rowcount int set @rowcount = 0 ; 
    BEGIN TRANSACTION [Tran1] 
    BEGIN TRY 
    insert into [database].[dbo].[tbl1] (fld1) values('1') ; 
     set @rowcount = (@rowcount + @@ROWCOUNT); 
    insert into [database].[dbo].[tbl2] (fld1) values('2') ; 
     set @rowcount = (@rowcount + @@ROWCOUNT); 

    IF @rowcount = 2 
     COMMIT TRANSACTION[Tran1] 
    ELSE 
     ROLLBACK TRANSACTION[Tran1] 
    END TRY 
     BEGIN CATCH 
     ROLLBACK TRANSACTION[Tran1] 
    END CATCH 
Смежные вопросы