powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Откат Update dw_1 при ошибке Update dw_2
27 сообщений из 27, показаны все 2 страниц
Откат Update dw_1 при ошибке Update dw_2
    #32821480
CVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!
На форме есть dw_1 и dw_2.
Код примерно такой:


li_ret = Parent.dw_1.Update()
if li_ret <> 1 then
rollback using SQLCA;
return
end if

li_ret = Parent.dw_2.Update()
if li_ret <> 1 then
rollback using SQLCA;
return
end if

как произвести откат Update dw_1, если при Update dw_2 произошла ошибка?
Заранее спасибо.

PB 9.0.1 build 7236 + MSSQL 2000
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821515
PaulJB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно откатить введенные в ДВ значения я использую сл.:

dw.Object.Data.primary.current[ row ] = dw.Object.Data.primary.original[ row ]
dw.setitemstatus( row, 0, primary!, notmodified! )
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821594
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял. А чем приведенный "примерно такой" код-то не устраивает?
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821620
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А! Дошло!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    if dw_1.AcceptText() <> 1 then return
    if dw_2.AcceptText() <> 1 then return

    li_ret = Parent.dw_1.Update(False,False)
    if li_ret <> 1 then
        rollback using SQLCA;
        return
    end if

    li_ret = Parent.dw_2.Update(False,False)
    if li_ret <> 1 then
        rollback using SQLCA;
        return
    end if

    Parent.dw_1.ResetUpdate()
    Parent.dw_2.ResetUpdate()

ну или что-то в этом духе.
т.е. флаги сбрасываем только если все Update прошли успешно.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821673
CVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я что-то упустил при вопросе ... мне нужно, чтобы прошел откат изменений, произведенных Parent.dw_1.Update() на SQL сервере.
Понятно, что execute immediate "begin transaction";
<что-то делаем на сервере>
<еще что-то делаем на сервере>
если что-то вдруг плохое случилось,то
execute immediate "rollback transaction";
иначе
execute immediate "commit transaction";

в данном случае не подходит.
Пример, приведенный Андреем, тоже не помог :(
Данные из dw_1 все равно попали на сервер.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821691
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CVAПонятно, что execute immediate "begin transaction";
<что-то делаем на сервере>
<еще что-то делаем на сервере>
если что-то вдруг плохое случилось,то
execute immediate "rollback transaction";
иначе
execute immediate "commit transaction";

в данном случае не подходит.
Почему это универсальный способ корректного модифицирования данных на сервере вдруг стал некошерным ;)?
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821704
gz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gz
Гость
CVA...Данные из dw_1 все равно попали на сервер.
Данные попадают на сервер только в одном случае - когда выполняется Commit
Ищите в программе, где он прошел.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821727
CVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем.
Стормозил я конкретно - забыл в свойствах соединения убрать AutoCommit :)
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32821981
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSSQL2000?
А драйвер какой?
Я вот всю жизнь работаю с MSSQL 6.x, 7, 2000 и т.д. с AutoCommit=True
и получается замечательно - блокировок минимум,
транзакциями управляю сам когда это нужно и отдаю серверу когда не нужно.
Понятно что при AutoCommit=True
транзакцию надо начинать самому
execute immediate "begin transaction";
тогда как при AutoCommit=False билдер сам начинает ее неявно по каждому CONNECT/COMMIT/ROLLBACK

З.Ы. к тем кто работает с ASA и Oracle вышесказанное не относится.

З.З.Ы. Ненавижу системы написанные с использованием драйвера PBMSSxxx.DLL с выключенным AutoCommit понатыканными повсюду COMMIT или ROLLBACK после каждого SELECT.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32822178
CVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, MSSQL 2000
Драйвер используется как раз pbmss90.dll
В том-то и дело, что при AutoCommit = True я пробовал использовать execute immediate "begin / commit / rollback transaction"; но одного понять не могу: данная инструкция распространяется на update для datawindow? т.е. обновление всех dw будет сделано одной транзакцией? Ну а если, допустим, в процессе обновления было совершено обновление dw_1, а при обновлении dw_2 произошла неожиданная ошибка? получится что при AutoCommit = True данные попадут на сервер, что не есть хорошо. Или я в чем-то искренне заблуждаюсь?
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32822244
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
данная инструкция распространяется на transaction object.
если явно не указано
EXECUTE IMMEDIATE SQLStatement USING TransactionObject ;
то относится оператор к SQLCA.
который у Вас один на оба DW.

чтобы отчетливо представлять себе что происходит можно включить трассировку SQLCA.DBMS='trace MSS'
прогнать с включенным и выключенным autocommit и сравнить логи.

Кста, как Вы назначаете transaction object?
dw.SetTransObject(SQLCA) или dw.SetTrans(SQLCA) ?
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32822321
CVA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
transaction object назначаю при помощи dw.SetTransObject(SQLCA)
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32822531
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может это вам поможет , хоть и написано не для MSSQL, но принцип наверное тот же.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32823675
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryo, но принцип наверное тот же

Принцип работы Autocommit в ASA совершенно другой.

Причем я явно упомянул что то что я излагаю к ASA и Oracle не относится.

В ASA есть "родной" режим Autocommit который билдер включает и все.
Никакой "эмуляции Autocommit" как в случае Sybase ASE/MS SQL при этом не требуется.

Забавно... мы лет шесть назад как раз именно c Sharon эту тему обсуждали.
Она была весьма удивлена тем насколько отличается работа с Autocommit для ASA и MSSQL/ASE.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32823759
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы вы потрудились заглянуть в статью, то заметили бы что там предлагается именно режим "эмуляции Autocommit" правда я не уверен, что вы конкретно подразумеваете под этим. Там предлагается держать AutoCommit=True и только перед началом транзакции переключать в Autocommit=False, делать обновления в базе и затем обратно устанавливать AutoCommit в True.
1.Begin the transaction (by setting AutoCommit to FALSE)
2.Do the Updates
3.End the transaction (by Committing or Rolling Back), then setting AutoCommit back to TRUE
4.Finally display any error message

Об этом и спрашивал CVA как ему начать транзакцию если включен Autocommit

авторВ ASA есть "родной" режим Autocommit который билдер включает и все. Все таки интересно как это PB сам "включает Autocommit и всё?
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32823848
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoВсе таки интересно как это PB сам "включает Autocommit и всё?не знаю как. и честно говоря мне пофиг как именно он это делает.
возьмите документацию по PB, ODBC SDK, ASA. поэкспериментирйуте, разберитесь, и потом нам расскажете. :-)
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32823871
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoЕсли бы вы потрудились заглянуть в статью
Я эту статью последний раз видел лет пять или шесть назад.
И обсуждал с автором т.е. с Sharon.
Ну может быть за это время она и изменилась.
Надо будет перечитать на досуге.
Только вряд ли мое мнение изменится.
Не нравятся мне эти шаманские пляски со включением-выключением на ходу.
Я когда с SQL Anywhere работал никогда так не делал.
AutoCommit=False был постоянно.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32823963
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как соотнести два ваших высказывания:
авторЯ когда с SQL Anywhere работал никогда так не делал.AutoCommit=False был постоянно
авторЗ.З.Ы. Ненавижу системы написанные с использованием драйвера PBMSSxxx.DLL с выключенным AutoCommit понатыканными повсюду COMMIT или ROLLBACK после каждого SELECT
Тогда, при работе с ASA, если у вас Autocommit был выключен, пришлось бы понатыкать "повсюду COMMIT или ROLLBACK после каждого SELECT" чтобы не висели открытые транзакции.

Все-таки ответьте человеку по MSSQL как ему открыть транзакцию при включенном Autocommit
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824152
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoКак соотнести два ваших высказыванияА нахрена, извините за выражение, их соотносить?
ASA и MSSQL это разные вещи - и соответственно требуют разного подхода.

Для MSSQL

Если Autocommit=True
то мы работаем изначально без транзакций.
Каждый оператор выполняется отдельно.
SELECT @@trancount возвращает 0.
Если мы начинаем транзакцию - мы можем ее закончить обычным COMMIT/ROLLBACK и возвращаемся таким образом в режим "без транзакций".

Если AutoCommit=False

то PB начинает транзакцию (BEGIN TRAN) сам автоматически после каждого
CONNECT/COMMIT/ROLLBACK.
Таким образом мы все время находимся в транзакции
(@@trancount = 1) - каждый кто знает MS SQL на приличном уровне - знает во что это выльется если не делать COMMIT/ROLLBACK после каждого буквально оператора.

Для ASA
Если Autocommit=True
включается специальный режим, когда каждый оператор представляет из себя отдельную транзакцию.
Мы фактически лишаемся возможности управлять транзакциями.

Если Autocommit=False
это нормальный стандартный режим работы для ASA.
Я не наблюдал никаких проблем с блокировками в этом режиме, соответственно необходимости расставлять роллбэки после SELECT-ов НЕТ.
Пусть знатоки ASA меня поправят если я ошибаюсь.

rcryoВсе-таки ответьте человеку по MSSQL как ему открыть транзакцию при включенном Autocommitexecute immediate "begin transaction";
другого ответа нет и быть не может
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824181
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрей
Для ASA
Я не наблюдал никаких проблем с блокировками в этом режиме, соответственно необходимости расставлять роллбэки после SELECT-ов НЕТ.
Пусть знатоки ASA меня поправят если я ошибаюсь.

В случае, если клиент выбрал result set не целиком (PB обычно так и делает - берет только первые несколько строк помещающиеся в видимую часть dw, ну плюс еще сколько-то :) ) В этом случае ODBC драйвер может держать курсор открытым и, до тех пор пока не закроет, на таблице будет висеть блокировка запрещающая изменять структуру таблицы.
Если выборка делается из локальной временной таблицы, которая объявляется внутри хранимой процедуры такой клиент (сделавший не полную выборку) может заблокировать других клиентов нафиг. Проблема была в самом PB8 - он просто не вызывал SQLCLoseCursor(). Доходило до смешного - юзер открыл окно с DW. Сделал запрос, посмотрел на результат, закрыл окно и ушел. Весь офис сосет лапу.... Коннект остался, программа готова для других запросов, но курсор-то остается открытым. Пришлось в событии Window.Close звать rollback;
На PB9 я этот глюк не проверял, оставил все rollback'и на местах, лучше перестраховаться :)
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824191
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlPB обычно так и делает
Сильно сомневаюсь что это так, для dw у которых не включен RetrieveAsNeeded.
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824229
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрей White OwlPB обычно так и делает
Сильно сомневаюсь что это так, для dw у которых не включен RetrieveAsNeeded.
ээээ... вообще-то, Rows As Needed включен для всех DW по умолчанию. А для тех у которых вручную включили Rows To Disk - оно конечно будет не совсем так :)
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824239
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По умолчанию Rows As Needed по умолчанию отключен. Адназначна!
Я так понял это у Вас типа корпоративный стандарт - включать Rows As Needed вручную всегда?
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824331
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перечитал все раза три, но так и не понял, как предлагают решить проблему. Просто любопытно.
Есть MS SQL 2000, один объект SQLCA и autocommit=true. Так как надо сделать, чтоб при ошибке при апдейте второго ДВ откатить и апдейт первого?
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824347
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрейПо умолчанию Rows As Needed по умолчанию отключен. Адназначна!
Я так понял это у Вас типа корпоративный стандарт - включать Rows As Needed вручную всегда?
Действительно, прогнал :) Выключен он по умолчанию. Впрочем, общей картины это не меняет :)
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824545
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТак как надо сделать, чтоб при ошибке при апдейте второго ДВ откатить и апдейт первого?нужно до начала обновления первого DW явно начать транзакцию. Зорин подсказывает, что это делается так:
Код: plaintext
1.
execute immediate "begin transaction";
...
Рейтинг: 0 / 0
Откат Update dw_1 при ошибке Update dw_2
    #32824640
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я правильно понял, что перед апдейтами ДВ делаем begin transaction, а после commit или rollback? И никакого автокоммита не будет в случае с MS SQL2000?
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Откат Update dw_1 при ошибке Update dw_2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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