powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
30 сообщений из 30, показаны все 2 страниц
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006524
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильно ли я понимаю следующее :
Если мне необходимо обеспечить целостность изменений то в сохраненной продцедуре я могу использовать код в следующем виде :
BEGIN TRANSACTION

INSERT ...
UPDATE ...
UPDATE ...

COMMIT TRANSACTION

Тоесть не забоиться о проверке ошибок, если во время любой из команд внутри транзакции произойдет ошибка то SQL Server сам вызовет ROLLBACK TRANSACTION ?
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006526
Неправильно.
Для достижения желаемого необходимо в процедуре до начала транзакции сказать:
SET XACT_ABORT ON
В этом случае при любой ошибке транзакция будет сама откачена и исполнение прервано.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006528
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Глеб Уфимцев
SET XACT_ABORT ON действует на конекшн, каким образом т. е. где его нужно поставить, что бы он сработал? У меня что то не получилось
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006530
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т. е. я хотел сказать что
SET XACT_ABORT ON
go
begin transaction
commit transaction

сработает, а вот

SET XACT_ABORT ON
begin transaction
commit transaction

не сработает, понятно, что go в процедуре не поставишь.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006533
SET XACT_ABORT ON
begin transaction
commit transaction

работает. Можешь проверить в ISQLW. А ставить SET XACT_ABORT ON можно в любом месте до объявлении транзакции. Маленькая деталь: выполнение оператора RAISERROR внутри транзакции не будет считаться ошибкой и не произведет действий по прерыванию батча и отката транзакции.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006543
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно.. А почему тогда
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?)
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006553
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На стадии разрешения отложенных имён , SQL Server выполняет также другие действия для проверки правильности (например, проверяя совместимость типа данных столбца с переменными). Перевод BOL - "Deferred Name Resolution and Compilation". Так что на этом этапе, подобный пример приводит к появлению синтаксической ошибки. А "ошибки компиляции, такие как ошибки синтаксиса на SET XACT_ABORT не распространяются".
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006568
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 почему то не получилось даже так
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006572
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Genady:

Ты писал custom resolver для merge replication ? А не подкинешь мне в качестве примера (greensunrise@mail.ru) ? Один из тех, что поставляется с SQL (datetime-based resolver) у меня не заработал. Никаких ошибок, все нормально, вот только победитель при конфликте выбирается неправильно. Заранее спасибо!
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006575
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 GreenSunrise
К сожалению, мой пример не сохранился, посколько это просто проба была, можете взять пример кода из BOL, см. Custom Stored Procedure Conflict Resolver и Merge Replication Samples.
Если не найдете, я могу сбросить его Вам на e-mail
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006582
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно этот sample у меня и не заработал нормально
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006588
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какую ошибку выдал? У меня проблема была с SET ANSI_NULLS ON, SET ANSI_WARNINGS ON.
Выше я писал как ее обошел.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006597
Конечно же так можно реагировать лишь на рантайм-ошибки, а не синтаксические. Синтаксические приводят к отказу от компиляции и транзакция просто не начинается. В примере, о котором я говорил, и который работает, я делал вставку в таблицу с нарушением 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)


Хотите верьте, хотите - нет, но работает, как именно я говорил.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006603
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот блин! И у меня сейчас работает 8[]
А в тот раз целый день бился ну нифига не выходило, нчиего не понимаю, не иначе барабашка.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006626
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Genady: я насчет sample'а... Он нормально компилился, нормально подключался, никаких ошибок при работе не выдавал, но победитель при разрешении конфликта выбирался неправильно. У меня создалось впечатление, что оставался дефолтный резолвер (priority-based). Хотя в настройках все стояло правильно...
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006629
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GreenSunrise, Я в своей процедуре использовал именно этот, слегка переработанный, примерчик. Я там сделал так, что победителем всегда был подписчик (по умолчанию у меня всегда победителем был почему то издатель) и все нормально работало. Может Вы просто где-то допустили ошибку в логике разрешения конфликта?
Открывайте новую ветку, обсудим или можно по почте gennady.kobzarev@trustlink.com, правда почта в данный момент переодически глючит.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006878
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, разве нельзя вот так:

begin tran
.....
if @@error!=0 rollback tran
else commit tran
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006882
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dmitry

Конечно можно и так, только нужно учитывать, что @@error тогда нужно проверять после каждой операции в транзакции, поскольку его значение сбрасывается перед выполнением очередного запроса
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006884
Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
Простите, что вклиниваюсь в обсуждение.

Уже имеется n-ое количество процедур и в каждой есть транзакция на обновление данных. Везде необходимо писать SET XACT_ABORT ON?
А есть ли у SQL 7.0 какой-нибудь параметр? В документации я не нашел.

За ранее спасибо.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006893
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006894
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dmitry
Удобство вещь субъективная
да и на юзеров лаять не всегда есть необходимость, а нужно просто окатить транзакцию.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006895
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dmitry
Удобство вещь субъективная
да и на юзеров лаять не всегда есть необходимость, а нужно просто откатить транзакцию.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006896
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dmitry
Удобство вещь субъективная
да и на юзеров лаять не всегда есть необходимость, а нужно просто откатить транзакцию. Кстати в Вашем примере слово Else явно лишнее
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006897
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dmitry
Удобство вещь субъективная
да и на юзеров лаять не всегда есть необходимость, а нужно просто откатить транзакцию. Кстати в Вашем примере слово Else я вно лишнее
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006898
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за дубли, я случайно размножился, наверное почкованием
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006919
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет дублей это ничего - до меня иногда долго доходит, так что даже полезно. А вот насчет "ELSE лишнее" не могу согласиться. Хотя можно опять списать на субъективность.
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006924
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Хотя можно опять списать на субъективность
Умгу, я предпочитаю в проверках делать rollback & return
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006951
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Genady
Tastes differ
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006952
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Dmitry
Не понял
...
Рейтинг: 0 / 0
BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
    #32006976
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Genady
Tastes differ - О вкусах не спорят (вольный перевод англ. пословицы)
Кстати - вопрос (м.б. не в тему)
Действительно ли нельзя вызвать stor. proc. с параметрами из Delphi, используя BDE. Точнее, вызвать то можно, если указать все до одного параметра. А если хоть один опустить - прут exception'ны. Хотя с ADO все работает.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / BEGIN TRANSACTION .... ROLLBACK TRANSACTION ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]