powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / try-except-end в ХП
17 сообщений из 17, страница 1 из 1
try-except-end в ХП
    #32188034
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста, как лучше реализовать (и, вообще, возможно-ли) в ХП то, что на клиенте сделано так:

СтартТранс;
try
Изменения;
ПодтверТранс;
except
ОткатТранс;
end;

или, по-другому, поддерживает ли IB вложенные трансакции (на уровне, что при откате последней внешней трансакции, можно корректно подтвердить оставшиеся, а при откате самой первой трансакции, отменялись бы все изменения, связанные с подтверждениями вложенных трансакций) и как (где) откатить последнюю (внешнюю) трансакцию в ХП, если по возникновению ошибки, я так понимаю, ХП приостанавливает свою работу?
Заранее благодарен за ответы.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188105
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хранимка - это одна транзакция. Такие вещи надо делать совместно с клиентом.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188134
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет "ХП - транзакция", спасибо, читал и забыл, а опыт мизерный.

1) При запущенной основной транзакции с клиента (Delphi6-ADO - IB6) "не выполняются вложенные транзакции", т.е какие бы не выполнялись вложенные транзакции (в смысле подтвержденные или с откатом) все зависит от подтверждения основной. Если откат основной, то все хорошо - все изменения отпадают, но если подтверждение основной, то подтверждаются и изменения, которые были отменены во вложенных транзакциях?!!

2) Не получится ли так (исходя из 1-го), что при запущенной основной транзакции и при неудачном вызыве ХП и последующем подтверждении основной транзакции подтвердятся и часть отработанных в ХП изменений?
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188171
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем понял твой вопрос ....
Но я бы зделал так :
1. начало транзакции
2. делаем все в контексте этой транзакции в том числе и вызов хранимок.
3. конец транзакции роллбак или коммит.

если где то мы получили по дороге ошибку то роллбак иначе коммит. Это не сложно реализовать. Хотя если в контексте выполнения транзакции происходит ошибочная ситуация то что коммит что роллбак не оставят никаких следов - работы транзакции в любом случае база откатит изменения.

по моему то о чем ты говоришь: вложенных транзакций нет, хотя в FB 1.5 появился механизм работы с транзакциями через savepoint'ы, но я как то обходился без него.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188183
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Живая ситуация такая... Работает юзер с БД, при первом изменении автоматом в клиенте стартует ТА, по замыслу, он подтверждает изменения по мере своей уверенности, что плоды его работы можно сохранить. Некоторые удаления (елементарные для юзера операции, как вставка и модификация) достаточно сложны и выполняются через ХП (каскадами не обойтись, и аналог ХП на клиенте - запрог. последовательность действий (что и не хорошо с т.з. трафика и СУБД в целом, да и через вложенные ТА точно не работает) тоже не годится). Вот тут и вопрос, если до удаления были нужные изменения, а после неудачного удаления что? Все в откат или все в подтверждение вместе с частью изменений неудачного удаления. Как быть? Неужели придется перед операциями сложноватых удалений требовать окончания активной транзакций ради новой только для удаления?
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188215
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я немного не понял почему удаление на целостной базе может вызвать ошибку ? по идее такого не должно быть ?
опиши пример возникновения такой ошибки .... сам механизм транзакций подразумевает что набор действий над базой - это как бы одно действие. В случае ошибки значит действие не корректно ....
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188241
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже не понял. Ошибки могут возникнуть всегда - основа целостности БД , конкуренция нескольких ТА разных юзеров, например (самый простой вариант - удаление уже удаленной с подтверждением записи). Вопрос таков, как сделать так, чтобы удаление (как изменение с ошибкой) не запоганила нужные изменения до этого удаления в пределах одной основной транзакции. Или только каждую элементарную с т. з. целостности БД операцию заключать в свою ТА?
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188271
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.ibase.ru/develop.htm#architecture

почитай здесь про транзакции ......
особенно про механизм версионности и сборку мусора....

ну теперь другая ситуация - ты подтвержаешь изменения в этой транзакции, но другой пользователь изменяет поле по которому ты удалешь ети данные, другой берет и изменяет тоже поля таким образом что ты удалишь чужие данные - это не конфликт с точки зрения базы, поскольку это разные отдельные транзакции, а ты просто потеряешь нужные данные.

Действия про которые ты говоришь должны выполняться в одной транзакции, а вслучае ошибки можно попытаться повторить их еще раз но в контексте другой транзакции.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188279
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто, наверняка, почти в любой БД при ее использовании элементарные изменения с т.з. целостности самой БД не всегда тоже самое, что некое "макродействие" юзера. Например, конкретно из моего, создал пользователь Площадь (элементарная операция целостности БД - ЭОЦБД), Скважину (тоже ЭОЦБД), Группу (тоже ЭОЦБД), навставлял геоданных (тоже ЭОЦБД), опа, данные не для той Группы-Скважины-Площади и... придется отменить все вместе с правильными изменениями (правильным созданием Группы-Скважины-Площади), я не прав , и делаю для себя вывод - работа должна быть такой, чтобы каждое элементарное действие клиента (т.е. одно из таких, "меньше" которых с т.з. пользовательского интерфейса клиента не сделаешь) сводилось к одной транзакции, подтверждение которой можно потянуть (дать возможность отменить) до следующего действия юзера, перед которым автоматом подтвердить предыдущее и т.д.

Хотя, мне интересно и вопрос остался...
Существует ли способ, чтобы удаление (как изменение с ошибкой) не запоганила нужные изменения до этого удаления в пределах одной (основной) транзакции.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188316
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то я понял твою проблему ;-)

1. Идеально твою идею можно реализовать на на Savepoint'ах, если ты готов начать работу с FB 1.5

SAVEPOINT savepoint_name; (create savepoint)
ROLLBACK [WORK] TO [SAVEPOINT] savepoint_name; (rollback to previously created savepoint)

то есть эта конструкция позволит отступить в контексте транзакции в любую точку и продолжить дальше.

2. Можно на клиенте реализовать чтото вроде буфера действий юзера.... и пока он не нажмет на кнопочку "Записать" никаких транзакций не начинается, а итоговая транзакция записывает все данные скопом уже верными.

3. В контексте транзакции можно Insert'ить записи и удалять их, изменять как угодно если ты в операторах delete и update условие при котором пользователь будет модифицировать и удалять только вставленные им же данные.

Хотя ты говорил про сложные ХП так что может тебе подойдет только 1й способ.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188323
Babrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Igor Elyas
А эти сэйвпойнты только в FB есть? В ХП их можно использовать? Где можно почитать обо всех новых фичах в FB (по сравнению с IB6)?
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188332
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Babrow
1. Я работаю только с FB так что не знаю.
2. В ХП нельзя поскольку в ХП нельзя управлять транзакциями в принципе.
3. Качаешь FB 1.5 там в каталоге документации лежит файлик WhatsNew.txt написано невнятно но можно разобраться.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188345
Babrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Igor Elyas
>В ХП нельзя поскольку в ХП нельзя управлять транзакциями в принципе.
ОЙ! Торможу... А на клиенте (Delphi) при помощи чего реализовать можно (не транзакции - сэйвпойнты). При помощи IBX это делается?
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188365
Igor Elyas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Babrow

IBX - зазработка Borland'a, сечас ее политика дистанцироваться от FireBird и Yaffil'a тож. Так что на будущее перелезай на Zeos - бесплатно, FIBplus очень хорошая либа для exUSSR - 15$, IBobjects - очень круто и очень дорого.

Будет работать - в нужной точке исполняй оператор SAVEPOINT - удобного способа в IBX нет но можно выкрутиться :-) придется головой поработать ;-).
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32188381
Babrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Igor Elyas

Спасибо.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32196438
zDIV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно это. Зачем выдумывать новые зарезервированные слова для каких-то точек. Почему бы разработчикам не заставить работать вложенные ТА, подобно вложениеям try-except/finally-end, типа каждая вложенная ТА автоматом формирует такую точку... Наверное, чего-то я не догоняю.
...
Рейтинг: 0 / 0
try-except-end в ХП
    #32196459
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так прочитал, но вроде никто этого не упомянул. Вложенные транзакции могут быть сэмулированы обработкой исключений, т.е. блоком WHEN , хотя это и нарушает атомарность транзакции. Т.о. можно просто сэмулировать оператор REPLACE:

...
INSERT ...
WHEN ANY
UPDATE ...
...
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / try-except-end в ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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