Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
Правильно ли я понимаю следующее : Если мне необходимо обеспечить целостность изменений то в сохраненной продцедуре я могу использовать код в следующем виде : BEGIN TRANSACTION INSERT ... UPDATE ... UPDATE ... COMMIT TRANSACTION Тоесть не забоиться о проверке ошибок, если во время любой из команд внутри транзакции произойдет ошибка то SQL Server сам вызовет ROLLBACK TRANSACTION ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2001, 13:05 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
Неправильно. Для достижения желаемого необходимо в процедуре до начала транзакции сказать: SET XACT_ABORT ON В этом случае при любой ошибке транзакция будет сама откачена и исполнение прервано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2001, 13:19 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Глеб Уфимцев SET XACT_ABORT ON действует на конекшн, каким образом т. е. где его нужно поставить, что бы он сработал? У меня что то не получилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2001, 13:28 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
Т. е. я хотел сказать что SET XACT_ABORT ON go begin transaction commit transaction сработает, а вот SET XACT_ABORT ON begin transaction commit transaction не сработает, понятно, что go в процедуре не поставишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2001, 13:30 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
SET XACT_ABORT ON begin transaction commit transaction работает. Можешь проверить в ISQLW. А ставить SET XACT_ABORT ON можно в любом месте до объявлении транзакции. Маленькая деталь: выполнение оператора RAISERROR внутри транзакции не будет считаться ошибкой и не произведет действий по прерыванию батча и отката транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2001, 13:49 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
Странно.. А почему тогда create table ##temp(a int) go CREATE PROCEDURE #test AS set xact_abort off begin tran insert into ##temp select 1 insert into ##temp select 'a' commit tran select * from ##temp go exec Затем делаем select * from ##test И там пусто... (без begin tran, commit tran там есть 1?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2001, 16:13 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
На стадии разрешения отложенных имён , SQL Server выполняет также другие действия для проверки правильности (например, проверяя совместимость типа данных столбца с переменными). Перевод BOL - "Deferred Name Resolution and Compilation". Так что на этом этапе, подобный пример приводит к появлению синтаксической ошибки. А "ошибки компиляции, такие как ошибки синтаксиса на SET XACT_ABORT не распространяются". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2001, 19:56 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Глеб Уфимцев Я проверял примерчик из BOL в QA, ток вот не работало там без GO, и в процедуре своей пробовал, то же самое . Я недавно пробовал resolver для merge репликации свой делать через ХП, так там нужно было включать ANSI Warnigs и ANSI_NULL, тоже промучался достаточно долго, пока не сдела скрипт по созданию процедур приблизительно так: SET ANSI_NULLS ON SET ANSI_WARNINGS ON GO Create procedure p as begin ....... end Вот только тогда заработало, а с SET XACT_ABORT ON почему то не получилось даже так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 05:27 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Genady: Ты писал custom resolver для merge replication ? А не подкинешь мне в качестве примера (greensunrise@mail.ru) ? Один из тех, что поставляется с SQL (datetime-based resolver) у меня не заработал. Никаких ошибок, все нормально, вот только победитель при конфликте выбирается неправильно. Заранее спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 05:37 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 GreenSunrise К сожалению, мой пример не сохранился, посколько это просто проба была, можете взять пример кода из BOL, см. Custom Stored Procedure Conflict Resolver и Merge Replication Samples. Если не найдете, я могу сбросить его Вам на e-mail ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 05:55 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 07:04 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
А какую ошибку выдал? У меня проблема была с SET ANSI_NULLS ON, SET ANSI_WARNINGS ON. Выше я писал как ее обошел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 07:34 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
Конечно же так можно реагировать лишь на рантайм-ошибки, а не синтаксические. Синтаксические приводят к отказу от компиляции и транзакция просто не начинается. В примере, о котором я говорил, и который работает, я делал вставку в таблицу с нарушением FK. Пример такой: set xact_abort ON begin tran update Banks set IdCityType=56 where Id=245731 -- FK нарушается update Banks set IdCityType=1 where Id=245732 -- FK не нарушается commit go select IdCityType from Banks where Id in (245731, 245732) результат: Server: Msg 547, Level 16, State 1, Line 1 UPDATE statement conflicted with COLUMN FOREIGN KEY constraint 'FK_Banks_CityTypes'. The conflict occurred in database 'OfficeAppDB', table 'CityTypes', column 'Id'. IdCityType ---------- NULL NULL (2 row(s) affected) Далее: set xact_abort OFF begin tran update Banks set IdCityType=56 where Id=245731 -- FK нарушается update Banks set IdCityType=1 where Id=245732 -- FK не нарушается commit go select IdCityType from Banks where Id in (245731, 245732) результат: Server: Msg 547, Level 16, State 1, Line 1 UPDATE statement conflicted with COLUMN FOREIGN KEY constraint 'FK_Banks_CityTypes'. The conflict occurred in database 'OfficeAppDB', table 'CityTypes', column 'Id'. The statement has been terminated. (1 row(s) affected) IdCityType ---------- NULL 1 (2 row(s) affected) Хотите верьте, хотите - нет, но работает, как именно я говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 08:18 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
Вот блин! И у меня сейчас работает 8[] А в тот раз целый день бился ну нифига не выходило, нчиего не понимаю, не иначе барабашка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 08:44 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Genady: я насчет sample'а... Он нормально компилился, нормально подключался, никаких ошибок при работе не выдавал, но победитель при разрешении конфликта выбирался неправильно. У меня создалось впечатление, что оставался дефолтный резолвер (priority-based). Хотя в настройках все стояло правильно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 11:08 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
GreenSunrise, Я в своей процедуре использовал именно этот, слегка переработанный, примерчик. Я там сделал так, что победителем всегда был подписчик (по умолчанию у меня всегда победителем был почему то издатель) и все нормально работало. Может Вы просто где-то допустили ошибку в логике разрешения конфликта? Открывайте новую ветку, обсудим или можно по почте gennady.kobzarev@trustlink.com, правда почта в данный момент переодически глючит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2001, 11:16 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
А что, разве нельзя вот так: begin tran ..... if @@error!=0 rollback tran else commit tran ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 08:11 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Dmitry Конечно можно и так, только нужно учитывать, что @@error тогда нужно проверять после каждой операции в транзакции, поскольку его значение сбрасывается перед выполнением очередного запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 08:42 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Простите, что вклиниваюсь в обсуждение. Уже имеется n-ое количество процедур и в каждой есть транзакция на обновление данных. Везде необходимо писать SET XACT_ABORT ON? А есть ли у SQL 7.0 какой-нибудь параметр? В документации я не нашел. За ранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 08:47 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Genady Согласен. Но по-моему все равно так удобнее. BEGIN TRAN INSERT ... IF @@ERROR!=0 BEGIN ROLLBACK TRAN RAISERROR "Лаем на user'ов!" END UPDATE ... ### UPDATE ... IF @@ERROR!=0 BEGIN ROLLBACK TRAN RAISERROR "Лаем на user'ов!" END ELSE COMMIT TRAN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 10:05 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Dmitry Удобство вещь субъективная да и на юзеров лаять не всегда есть необходимость, а нужно просто окатить транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 10:27 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Dmitry Удобство вещь субъективная да и на юзеров лаять не всегда есть необходимость, а нужно просто откатить транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 10:27 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Dmitry Удобство вещь субъективная да и на юзеров лаять не всегда есть необходимость, а нужно просто откатить транзакцию. Кстати в Вашем примере слово Else явно лишнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 10:28 |
|
||
|
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
|
|||
|---|---|---|---|
|
#18+
2 Dmitry Удобство вещь субъективная да и на юзеров лаять не всегда есть необходимость, а нужно просто откатить транзакцию. Кстати в Вашем примере слово Else я вно лишнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2001, 10:28 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32006582&tid=1826585]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
58ms |
get topic data: |
13ms |
get forum data: |
5ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 450ms |

| 0 / 0 |
