Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Приветствую! На форме есть 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 16:45 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Если нужно откатить введенные в ДВ значения я использую сл.: dw.Object.Data.primary.current[ row ] = dw.Object.Data.primary.original[ row ] dw.setitemstatus( row, 0, primary!, notmodified! ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 16:56 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Не понял. А чем приведенный "примерно такой" код-то не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 17:25 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
А! Дошло! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ну или что-то в этом духе. т.е. флаги сбрасываем только если все Update прошли успешно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 17:35 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Может я что-то упустил при вопросе ... мне нужно, чтобы прошел откат изменений, произведенных Parent.dw_1.Update() на SQL сервере. Понятно, что execute immediate "begin transaction"; <что-то делаем на сервере> <еще что-то делаем на сервере> если что-то вдруг плохое случилось,то execute immediate "rollback transaction"; иначе execute immediate "commit transaction"; в данном случае не подходит. Пример, приведенный Андреем, тоже не помог :( Данные из dw_1 все равно попали на сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 17:54 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
CVAПонятно, что execute immediate "begin transaction"; <что-то делаем на сервере> <еще что-то делаем на сервере> если что-то вдруг плохое случилось,то execute immediate "rollback transaction"; иначе execute immediate "commit transaction"; в данном случае не подходит. Почему это универсальный способ корректного модифицирования данных на сервере вдруг стал некошерным ;)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 18:00 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
CVA...Данные из dw_1 все равно попали на сервер. Данные попадают на сервер только в одном случае - когда выполняется Commit Ищите в программе, где он прошел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 18:05 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Спасибо всем. Стормозил я конкретно - забыл в свойствах соединения убрать AutoCommit :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 18:16 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 20:46 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Да, MSSQL 2000 Драйвер используется как раз pbmss90.dll В том-то и дело, что при AutoCommit = True я пробовал использовать execute immediate "begin / commit / rollback transaction"; но одного понять не могу: данная инструкция распространяется на update для datawindow? т.е. обновление всех dw будет сделано одной транзакцией? Ну а если, допустим, в процессе обновления было совершено обновление dw_1, а при обновлении dw_2 произошла неожиданная ошибка? получится что при AutoCommit = True данные попадут на сервер, что не есть хорошо. Или я в чем-то искренне заблуждаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 08:04 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
данная инструкция распространяется на transaction object. если явно не указано EXECUTE IMMEDIATE SQLStatement USING TransactionObject ; то относится оператор к SQLCA. который у Вас один на оба DW. чтобы отчетливо представлять себе что происходит можно включить трассировку SQLCA.DBMS='trace MSS' прогнать с включенным и выключенным autocommit и сравнить логи. Кста, как Вы назначаете transaction object? dw.SetTransObject(SQLCA) или dw.SetTrans(SQLCA) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 09:25 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
transaction object назначаю при помощи dw.SetTransObject(SQLCA) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 09:58 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
может это вам поможет , хоть и написано не для MSSQL, но принцип наверное тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 11:00 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
rcryo, но принцип наверное тот же Принцип работы Autocommit в ASA совершенно другой. Причем я явно упомянул что то что я излагаю к ASA и Oracle не относится. В ASA есть "родной" режим Autocommit который билдер включает и все. Никакой "эмуляции Autocommit" как в случае Sybase ASE/MS SQL при этом не требуется. Забавно... мы лет шесть назад как раз именно c Sharon эту тему обсуждали. Она была весьма удивлена тем насколько отличается работа с Autocommit для ASA и MSSQL/ASE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 16:18 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Если бы вы потрудились заглянуть в статью, то заметили бы что там предлагается именно режим "эмуляции 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 и всё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 16:39 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
rcryoВсе таки интересно как это PB сам "включает Autocommit и всё?не знаю как. и честно говоря мне пофиг как именно он это делает. возьмите документацию по PB, ODBC SDK, ASA. поэкспериментирйуте, разберитесь, и потом нам расскажете. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 17:06 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
rcryoЕсли бы вы потрудились заглянуть в статью Я эту статью последний раз видел лет пять или шесть назад. И обсуждал с автором т.е. с Sharon. Ну может быть за это время она и изменилась. Надо будет перечитать на досуге. Только вряд ли мое мнение изменится. Не нравятся мне эти шаманские пляски со включением-выключением на ходу. Я когда с SQL Anywhere работал никогда так не делал. AutoCommit=False был постоянно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 17:12 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Как соотнести два ваших высказывания: авторЯ когда с SQL Anywhere работал никогда так не делал.AutoCommit=False был постоянно авторЗ.З.Ы. Ненавижу системы написанные с использованием драйвера PBMSSxxx.DLL с выключенным AutoCommit понатыканными повсюду COMMIT или ROLLBACK после каждого SELECT Тогда, при работе с ASA, если у вас Autocommit был выключен, пришлось бы понатыкать "повсюду COMMIT или ROLLBACK после каждого SELECT" чтобы не висели открытые транзакции. Все-таки ответьте человеку по MSSQL как ему открыть транзакцию при включенном Autocommit ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 17:42 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
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"; другого ответа нет и быть не может ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 19:08 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
ЗоринАндрей Для ASA Я не наблюдал никаких проблем с блокировками в этом режиме, соответственно необходимости расставлять роллбэки после SELECT-ов НЕТ. Пусть знатоки ASA меня поправят если я ошибаюсь. В случае, если клиент выбрал result set не целиком (PB обычно так и делает - берет только первые несколько строк помещающиеся в видимую часть dw, ну плюс еще сколько-то :) ) В этом случае ODBC драйвер может держать курсор открытым и, до тех пор пока не закроет, на таблице будет висеть блокировка запрещающая изменять структуру таблицы. Если выборка делается из локальной временной таблицы, которая объявляется внутри хранимой процедуры такой клиент (сделавший не полную выборку) может заблокировать других клиентов нафиг. Проблема была в самом PB8 - он просто не вызывал SQLCLoseCursor(). Доходило до смешного - юзер открыл окно с DW. Сделал запрос, посмотрел на результат, закрыл окно и ушел. Весь офис сосет лапу.... Коннект остался, программа готова для других запросов, но курсор-то остается открытым. Пришлось в событии Window.Close звать rollback; На PB9 я этот глюк не проверял, оставил все rollback'и на местах, лучше перестраховаться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 19:37 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
White OwlPB обычно так и делает Сильно сомневаюсь что это так, для dw у которых не включен RetrieveAsNeeded. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 19:44 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
ЗоринАндрей White OwlPB обычно так и делает Сильно сомневаюсь что это так, для dw у которых не включен RetrieveAsNeeded. ээээ... вообще-то, Rows As Needed включен для всех DW по умолчанию. А для тех у которых вручную включили Rows To Disk - оно конечно будет не совсем так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 20:26 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
По умолчанию Rows As Needed по умолчанию отключен. Адназначна! Я так понял это у Вас типа корпоративный стандарт - включать Rows As Needed вручную всегда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 20:33 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
Перечитал все раза три, но так и не понял, как предлагают решить проблему. Просто любопытно. Есть MS SQL 2000, один объект SQLCA и autocommit=true. Так как надо сделать, чтоб при ошибке при апдейте второго ДВ откатить и апдейт первого? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 23:13 |
|
||
|
Откат Update dw_1 при ошибке Update dw_2
|
|||
|---|---|---|---|
|
#18+
ЗоринАндрейПо умолчанию Rows As Needed по умолчанию отключен. Адназначна! Я так понял это у Вас типа корпоративный стандарт - включать Rows As Needed вручную всегда? Действительно, прогнал :) Выключен он по умолчанию. Впрочем, общей картины это не меняет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2004, 00:14 |
|
||
|
|

start [/forum/topic.php?fid=15&startmsg=32821480&tid=1338654]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
155ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 286ms |
| total: | 551ms |

| 0 / 0 |
