2014-01-06 2 views
0

Я научился использовать Try ... Catch and Transactions в SQL и им пытаюсь проверить это на некоторых данных, которые у меня есть. Из того, что я узнал, если одно выполнение завершилось неудачно, тогда улов должен откат всей партии, поэтому ни одна из таблиц в секции TRY не должна обновляться, ОДНАКО, когда я запустил это, он выкинет ошибку для таблицы @b в блок поймать, но он все равно будет вставлять значения для таблицы @aSQL-транзакция в try ... catch не будет откатываться

SET XACT_ABORT ON; 

Begin Try 
    Begin Transaction s1 
    Insert Into @a 
     Values(@CountryId,@Country,@CountryCode,@DisplayImage,0,@ContinentCode,40) 
    Insert Into @b 
     Values('xxxxx',@ContinentCode,@Continent,0) --ERROR 
    Commit Transaction 
End Try 
Begin Catch 
    Select ERROR_NUMBER(),ERROR_MESSAGE() 
    Rollback Transaction s1 
End Catch 

select * from @a 
select * from @b 

Загвоздка работает блок, и я вижу eRROR_NUMBER и error_message, но не первая вставка получить откат?

ответ

1

Переменные и переменные таблицы не являются частью модификации данных, поэтому они не откатываются. Откат или сохранение транзакций работают для изменения данных. в вашем коде используйте временные таблицы вместо переменных таблицы. Это сработает.

+1

Второй комментарий Amirreza. У вас также есть SET XACT_ABORT. В любом случае это должно отбросить транзакцию: вы можете отключить его, чтобы ваш код действительно делал что-то. –

+1

Я хочу указать на то, что переменные таблицы не откатываются, так как это означает, что вы можете использовать их для хранения информации, которую вы можете поместить в таблицу исключений после откат. – HLGEM

+0

@HLGEM: Да, это преимущество табличных переменных в этом случае вы упомянули. –

Смежные вопросы