Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
Всем привет!
Что-то я опять не то делаю.
Я пытаюсь сделать откат транзакции в случае, если транзакция не проходит.
Например, у меня в транзакции делаются все действия успешно, но вот обновление одной таблицы Table1 не проходит, т.к. условие WHERE не выполняется.

Но у меня в результате откат никакой не проходит и сообщение, которое в PRINT прописываю не выходит. Транзакция выполняется успешно, вот только Table1 не обновляется.
Где у меня ошибка, подскажите, пожалуйста?

BEGIN TRAN @Transaction1
BEGIN TRY

--Здесь происходят разные действия, а потом делается обновление таблицы Table1:
UPDATE Table1
SET Pole2='43'
WHERE Pole1='Zakaz 554'

COMMIT TRAN @Transaction1
END TRY
BEGIN CATCH 
       ROLLBACK TRAN @Transaction1 
	   PRINT 'UPS...Не все строки доступны для удаления.'
END CATCH
20 ноя 14, 13:44    [16878293]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
т.к. условие WHERE не выполняется.

И почему при этом должна срабатывать CATCH ?
20 ноя 14, 13:46    [16878312]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
LisSp
Где у меня ошибка, подскажите, пожалуйста?

в нечитании документации
20 ноя 14, 13:47    [16878320]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
Не вижу я нигде в документации, чтобы ясно было как обращаться с транзакциями... Вот надо мне прописать в CATCH, что если транзакция не выполняется, то должен произойти откат. Но как написать? IF @Transaction1...??
20 ноя 14, 14:18    [16878667]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
Вот надо мне прописать в CATCH, что если транзакция не выполняется,

Выполняются команды, а не транзакции
Транзакция - это механизм, который заставляет сервер оперировать несколькими командами как одной.
20 ноя 14, 14:22    [16878708]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
LisSp
если транзакция не выполняется
а что должно было выполниться, если условие в WHERE не вернуло TRUE?
20 ноя 14, 14:23    [16878715]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
Вот надо мне прописать в CATCH, что если транзакция не выполняется,

Выполняются команды, а не транзакции
Транзакция - это механизм, который заставляет сервер оперировать несколькими командами как одной.


дак вот я объединяю много команд в одной транзакции, чтобы если одна из команд не выполнилась, то пусть вся транзакция считается не выполненной.. Или не правильно?
20 ноя 14, 14:25    [16878733]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
дак вот я объединяю много команд в одной транзакции, чтобы если одна из команд не выполнилась

Что такое для вас "команда не выполнилась" ?
20 ноя 14, 14:25    [16878738]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
LisSp
Например, у меня в транзакции делаются все действия успешно, но вот обновление одной таблицы Table1 не проходит, т.к. условие WHERE не выполняется.


так, с точки зрения сервера, это ошибкой не является. update-ы, не затрагивающие ни обной строки, вполне себе допустимы. если это ошибка по вашей прикладной логике, то отслеживать такие случаи и ошибки вам придется возбуждать самому.
20 ноя 14, 14:27    [16878755]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
LisSp
если транзакция не выполняется
а что должно было выполниться, если условие в WHERE не вернуло TRUE?
Хотя, вопрос снимается - триггер-то должен выполниться, если он есть...
Триггер есть? Он выполнился? А причём здесь транзакция тогда?
20 ноя 14, 14:27    [16878758]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
iap
LisSp
если транзакция не выполняется
а что должно было выполниться, если условие в WHERE не вернуло TRUE?

Должен быть 0.
Допустим в catch я пропишу: что если вот в этом апдейте 0, то откати транзакцию.. То мне придётся так для каждой команды писать, которые у меня есть в транзакции. Их немного..10 примерно. Но ведь, как мне кажется, должен быть какой-то способ, чтобы указать, что если в целом транзакция в какой-то из команд вернула 0, то пусть произойдёт откат транзакции..
20 ноя 14, 14:28    [16878768]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
Допустим в catch я пропишу: что если вот в этом апдейте 0, то откати транзакцию..

Ну так пропишите. Откуда сервер то должен об этом узнать заранее ?
20 ноя 14, 14:30    [16878781]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
LisSp,

проверьте @@ROWCOUNT на 0 и напишите RAISERROR() соответствующий
20 ноя 14, 14:31    [16878793]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
Допустим в catch я пропишу: что если вот в этом апдейте 0, то откати транзакцию..

Ну так пропишите. Откуда сервер то должен об этом узнать заранее ?

дак а если у меня несколько апдейтов, то мне про каждый писать? Или можно в целом написать про транзакцию? + у меня в транзакции ещё и delete строчек есть..
Я то мечтаю одной строчкой прописать что-то типа IF TRAN @Transaction1 ERROR THEN ROLLBACK
Вот узнаю можно или нет что-то подобное сотворить? И как это сделать?
20 ноя 14, 14:34    [16878818]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
LisSp
дак а если у меня несколько апдейтов, то мне про каждый писать? Или можно в целом написать про транзакцию? + у меня в транзакции ещё и delete строчек есть..
Я то мечтаю одной строчкой прописать что-то типа IF TRAN @Transaction1 ERROR THEN ROLLBACK
Вот узнаю можно или нет что-то подобное сотворить? И как это сделать?


еще раз - запрос (update/delete/insert/select), не затронувший ни одной записи, в sql - нормальное явление - это ни разу не ошибка.
20 ноя 14, 14:36    [16878844]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
daw
LisSp
дак а если у меня несколько апдейтов, то мне про каждый писать? Или можно в целом написать про транзакцию? + у меня в транзакции ещё и delete строчек есть..
Я то мечтаю одной строчкой прописать что-то типа IF TRAN @Transaction1 ERROR THEN ROLLBACK
Вот узнаю можно или нет что-то подобное сотворить? И как это сделать?


еще раз - запрос (update/delete/insert/select), не затронувший ни одной записи, в sql - нормальное явление - это ни разу не ошибка.


даа... дошло...
20 ноя 14, 14:37    [16878851]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
_djХомяГ
Guest
Транзакия - это "неделимая атомарная" операция Либо все либо ничего
Поэтому если объединяйте несколько DML операторов в одну транзакцию, то либо все выполнится либо транзакция откатится
20 ноя 14, 14:38    [16878863]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
iap
LisSp,

проверьте @@ROWCOUNT на 0 и напишите RAISERROR() соответствующий

Спасибо!!!
20 ноя 14, 14:39    [16878864]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
LisSp
Member

Откуда:
Сообщений: 186
Спасибо всем! До меня дошло!))
20 ноя 14, 14:39    [16878869]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
LisSp
iap
LisSp,

проверьте @@ROWCOUNT на 0 и напишите RAISERROR() соответствующий

Спасибо!!!


только эта... вы сначала документацию по @@rowcount почитайте. _внимательно_ почитайте.
20 ноя 14, 14:41    [16878884]     Ответить | Цитировать Сообщить модератору
 Re: Не получается Try/Catch  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
_djХомяГ
Транзакия - это "неделимая атомарная" операция Либо все либо ничего
Поэтому если объединяйте несколько DML операторов в одну транзакцию, то либо все выполнится либо транзакция откатится
К сожалению, зависит от SET XACT_ABORT.
Если установить её в ON, - то так и будет.
Но Microsoft почему-то сделал по-умолчанию SET XACT_ABORT OFF...
20 ноя 14, 14:41    [16878890]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить