|
|
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Подскажите, пожалуйста, как лучше реализовать (и, вообще, возможно-ли) в ХП то, что на клиенте сделано так: СтартТранс; try Изменения; ПодтверТранс; except ОткатТранс; end; или, по-другому, поддерживает ли IB вложенные трансакции (на уровне, что при откате последней внешней трансакции, можно корректно подтвердить оставшиеся, а при откате самой первой трансакции, отменялись бы все изменения, связанные с подтверждениями вложенных трансакций) и как (где) откатить последнюю (внешнюю) трансакцию в ХП, если по возникновению ошибки, я так понимаю, ХП приостанавливает свою работу? Заранее благодарен за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 10:21 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Хранимка - это одна транзакция. Такие вещи надо делать совместно с клиентом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 11:45 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Насчет "ХП - транзакция", спасибо, читал и забыл, а опыт мизерный. 1) При запущенной основной транзакции с клиента (Delphi6-ADO - IB6) "не выполняются вложенные транзакции", т.е какие бы не выполнялись вложенные транзакции (в смысле подтвержденные или с откатом) все зависит от подтверждения основной. Если откат основной, то все хорошо - все изменения отпадают, но если подтверждение основной, то подтверждаются и изменения, которые были отменены во вложенных транзакциях?!! 2) Не получится ли так (исходя из 1-го), что при запущенной основной транзакции и при неудачном вызыве ХП и последующем подтверждении основной транзакции подтвердятся и часть отработанных в ХП изменений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 12:13 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Не совсем понял твой вопрос .... Но я бы зделал так : 1. начало транзакции 2. делаем все в контексте этой транзакции в том числе и вызов хранимок. 3. конец транзакции роллбак или коммит. если где то мы получили по дороге ошибку то роллбак иначе коммит. Это не сложно реализовать. Хотя если в контексте выполнения транзакции происходит ошибочная ситуация то что коммит что роллбак не оставят никаких следов - работы транзакции в любом случае база откатит изменения. по моему то о чем ты говоришь: вложенных транзакций нет, хотя в FB 1.5 появился механизм работы с транзакциями через savepoint'ы, но я как то обходился без него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 12:45 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Живая ситуация такая... Работает юзер с БД, при первом изменении автоматом в клиенте стартует ТА, по замыслу, он подтверждает изменения по мере своей уверенности, что плоды его работы можно сохранить. Некоторые удаления (елементарные для юзера операции, как вставка и модификация) достаточно сложны и выполняются через ХП (каскадами не обойтись, и аналог ХП на клиенте - запрог. последовательность действий (что и не хорошо с т.з. трафика и СУБД в целом, да и через вложенные ТА точно не работает) тоже не годится). Вот тут и вопрос, если до удаления были нужные изменения, а после неудачного удаления что? Все в откат или все в подтверждение вместе с частью изменений неудачного удаления. Как быть? Неужели придется перед операциями сложноватых удалений требовать окончания активной транзакций ради новой только для удаления? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 13:00 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
я немного не понял почему удаление на целостной базе может вызвать ошибку ? по идее такого не должно быть ? опиши пример возникновения такой ошибки .... сам механизм транзакций подразумевает что набор действий над базой - это как бы одно действие. В случае ошибки значит действие не корректно .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 13:19 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Тоже не понял. Ошибки могут возникнуть всегда - основа целостности БД , конкуренция нескольких ТА разных юзеров, например (самый простой вариант - удаление уже удаленной с подтверждением записи). Вопрос таков, как сделать так, чтобы удаление (как изменение с ошибкой) не запоганила нужные изменения до этого удаления в пределах одной основной транзакции. Или только каждую элементарную с т. з. целостности БД операцию заключать в свою ТА? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 13:38 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
http://www.ibase.ru/develop.htm#architecture почитай здесь про транзакции ...... особенно про механизм версионности и сборку мусора.... ну теперь другая ситуация - ты подтвержаешь изменения в этой транзакции, но другой пользователь изменяет поле по которому ты удалешь ети данные, другой берет и изменяет тоже поля таким образом что ты удалишь чужие данные - это не конфликт с точки зрения базы, поскольку это разные отдельные транзакции, а ты просто потеряешь нужные данные. Действия про которые ты говоришь должны выполняться в одной транзакции, а вслучае ошибки можно попытаться повторить их еще раз но в контексте другой транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 13:58 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Просто, наверняка, почти в любой БД при ее использовании элементарные изменения с т.з. целостности самой БД не всегда тоже самое, что некое "макродействие" юзера. Например, конкретно из моего, создал пользователь Площадь (элементарная операция целостности БД - ЭОЦБД), Скважину (тоже ЭОЦБД), Группу (тоже ЭОЦБД), навставлял геоданных (тоже ЭОЦБД), опа, данные не для той Группы-Скважины-Площади и... придется отменить все вместе с правильными изменениями (правильным созданием Группы-Скважины-Площади), я не прав , и делаю для себя вывод - работа должна быть такой, чтобы каждое элементарное действие клиента (т.е. одно из таких, "меньше" которых с т.з. пользовательского интерфейса клиента не сделаешь) сводилось к одной транзакции, подтверждение которой можно потянуть (дать возможность отменить) до следующего действия юзера, перед которым автоматом подтвердить предыдущее и т.д. Хотя, мне интересно и вопрос остался... Существует ли способ, чтобы удаление (как изменение с ошибкой) не запоганила нужные изменения до этого удаления в пределах одной (основной) транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 14:05 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Наконец-то я понял твою проблему ;-) 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й способ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 14:36 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
2 Igor Elyas А эти сэйвпойнты только в FB есть? В ХП их можно использовать? Где можно почитать обо всех новых фичах в FB (по сравнению с IB6)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 14:44 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
2 Babrow 1. Я работаю только с FB так что не знаю. 2. В ХП нельзя поскольку в ХП нельзя управлять транзакциями в принципе. 3. Качаешь FB 1.5 там в каталоге документации лежит файлик WhatsNew.txt написано невнятно но можно разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 14:56 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
2 Igor Elyas >В ХП нельзя поскольку в ХП нельзя управлять транзакциями в принципе. ОЙ! Торможу... А на клиенте (Delphi) при помощи чего реализовать можно (не транзакции - сэйвпойнты). При помощи IBX это делается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 15:05 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
2 Babrow IBX - зазработка Borland'a, сечас ее политика дистанцироваться от FireBird и Yaffil'a тож. Так что на будущее перелезай на Zeos - бесплатно, FIBplus очень хорошая либа для exUSSR - 15$, IBobjects - очень круто и очень дорого. Будет работать - в нужной точке исполняй оператор SAVEPOINT - удобного способа в IBX нет но можно выкрутиться :-) придется головой поработать ;-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 15:15 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
2 Igor Elyas Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2003, 15:27 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
Странно это. Зачем выдумывать новые зарезервированные слова для каких-то точек. Почему бы разработчикам не заставить работать вложенные ТА, подобно вложениеям try-except/finally-end, типа каждая вложенная ТА автоматом формирует такую точку... Наверное, чего-то я не догоняю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 16:55 |
|
||
|
try-except-end в ХП
|
|||
|---|---|---|---|
|
#18+
я так прочитал, но вроде никто этого не упомянул. Вложенные транзакции могут быть сэмулированы обработкой исключений, т.е. блоком WHEN , хотя это и нарушает атомарность транзакции. Т.о. можно просто сэмулировать оператор REPLACE: ... INSERT ... WHEN ANY UPDATE ... ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2003, 17:05 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32188134&tid=1580304]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
392ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 223ms |
| total: | 721ms |

| 0 / 0 |
