|
![]() |
#1 |
MCT
|
Собственно написал, что бы было понятно ищущим знаний коллегам.
![]()
__________________
Axapta book for developer |
|
![]() |
#2 |
Участник
|
Я считаю что при необходимости вполне можно транзакцию вне цикла открывать... но вот потенциально бесконечный цикл....блин...как вижу этот true так в дрожь))))
|
|
|
За это сообщение автора поблагодарили: MikeR (2). |
![]() |
#3 |
Дмитрий Ерин
|
MikeR, в ваших примерах из п. 4 и 5 идет обработка плоских данных, для которых отмена части транзакций не критична, ибо они могут быть выполнены позже простым повторным запуском того же кода. А в исходном алгоритме (п. 1) идет обход узлов дерева, причем выполняется операция +=. Если такой обход раздробить на мелкие транзакции, то при их частичном откате восстановить целостность данных будет невозможно физически (если явно не хранить историю обновления).
Ну а пример из п. 2 (while select...) неприменим для обхода дерева при заданной в п.1 структуре данных. Наверное это вам и пытаются сказать... PS: С тем, что п.5 более корректен в общем случае, чем п.4 - согласен.
__________________
![]() |
|
![]() |
#4 |
MCT
|
Что сказали, то сказали, бумага все стерпит.
![]() С плоскими разобрались, так понимаю. НО ДАЖЕ в иерархической реализации это дает результат. Представляете если это достаточно большой пул проводок. Все напрочь блокируется, а какова вероятность, что произойдет исключительная ситуация? На практике это менее 5 процентов. Что стоит каждый раз терпеть блокировки или тупо следовать надуманной целостности, которая даже еще и не думала нарушаться... ![]() Не говоря о том, что по мелочам 1) X++: SELECT FIRSTONLY current WHERE current.InvGuid == InvGUID; InvGUID = current.ParentInvGUID; SELECT FIRSTONLY parent WHERE current.ParentInvGUID == parent.InvGUID; 2) X++: parentDistr.AMOUNTCUR += inventoryGuidInvoice.AmountCur;//слияние к предку ![]()
__________________
Axapta book for developer |
|
![]() |
#5 |
Британский учённый
|
Цитата:
![]()
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
![]() |
#6 |
Участник
|
|
|
![]() |
#7 |
MCT
|
Скажем так, я переделал - работать стало ЗНАЧИТЕЛЬНО быстрее, сбоев не было вообще, проценты - это оценочное суждение
![]()
__________________
Axapta book for developer |
|
![]() |
#8 |
Участник
|
Может быть в данном конкретном случае то никогда не случится, а может быть это случится на следующей неделе - попробуй, например, запустить этот процесс с двух машин одновременно
|
|
![]() |
#9 |
MCT
|
Правильно ли я тебя понимаю, что когда, допустим в разноске надо обновить два десятка таблиц и вставить в еще пару десятков, то методологически правильно открывать ОДНУ транзакцию, вешать блокировку while select forupdate по обновляемым таблицам? Иначе тоже может произойти пук и мы потеряем целостность, то есть запишем в таблицу налогов одни цифири, а допустим документы не обновим.
__________________
Axapta book for developer |
|
Теги |
базовая информация, транзакции |
|
|