Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Откат Update dw_1 при ошибке Update dw_2 / 25 сообщений из 27, страница 1 из 2
09.12.2004, 16:45
    #32821480
CVA
CVA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
Приветствую!
На форме есть 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
09.12.2004, 16:56
    #32821515
PaulJB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
Если нужно откатить введенные в ДВ значения я использую сл.:

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

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

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

в данном случае не подходит.
Почему это универсальный способ корректного модифицирования данных на сервере вдруг стал некошерным ;)?
...
Рейтинг: 0 / 0
09.12.2004, 18:05
    #32821704
gz
gz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
CVA...Данные из dw_1 все равно попали на сервер.
Данные попадают на сервер только в одном случае - когда выполняется Commit
Ищите в программе, где он прошел.
...
Рейтинг: 0 / 0
09.12.2004, 18:16
    #32821727
CVA
CVA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
Спасибо всем.
Стормозил я конкретно - забыл в свойствах соединения убрать AutoCommit :)
...
Рейтинг: 0 / 0
09.12.2004, 20:46
    #32821981
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
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
10.12.2004, 08:04
    #32822178
CVA
CVA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
Да, MSSQL 2000
Драйвер используется как раз pbmss90.dll
В том-то и дело, что при AutoCommit = True я пробовал использовать execute immediate "begin / commit / rollback transaction"; но одного понять не могу: данная инструкция распространяется на update для datawindow? т.е. обновление всех dw будет сделано одной транзакцией? Ну а если, допустим, в процессе обновления было совершено обновление dw_1, а при обновлении dw_2 произошла неожиданная ошибка? получится что при AutoCommit = True данные попадут на сервер, что не есть хорошо. Или я в чем-то искренне заблуждаюсь?
...
Рейтинг: 0 / 0
10.12.2004, 09:25
    #32822244
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
данная инструкция распространяется на transaction object.
если явно не указано
EXECUTE IMMEDIATE SQLStatement USING TransactionObject ;
то относится оператор к SQLCA.
который у Вас один на оба DW.

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

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

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

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

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

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

Все-таки ответьте человеку по MSSQL как ему открыть транзакцию при включенном Autocommit
...
Рейтинг: 0 / 0
10.12.2004, 19:08
    #32824152
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
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
10.12.2004, 19:37
    #32824181
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Откат Update dw_1 при ошибке Update dw_2
ЗоринАндрей
Для ASA
Я не наблюдал никаких проблем с блокировками в этом режиме, соответственно необходимости расставлять роллбэки после SELECT-ов НЕТ.
Пусть знатоки ASA меня поправят если я ошибаюсь.

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


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