22.01.2014, 09:44 | #1 |
Участник
|
Коллеги, что вы думаете о данном коде? 2MikeR
Цитата:
Какое отношение это имеет к исходному вопросу? По вашему, транзакция нужна только потому, что Аксапта иначе не дает апдейт сделать?
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: macklakov (1), S.Kuskov (2). |
22.01.2014, 13:37 | #2 |
MCT
|
Там смысл именно в том, что бы обновлять другим способом, делать транзацию внутри цикла, а не во вне. Собственно об этом я тогда и писал, просто нашел подтверждение своим мыслям, вот и все.
__________________
Axapta book for developer |
|
22.01.2014, 13:48 | #3 |
MCT
|
Для карсоты решения еще раз приведу утверждения
1 С чего все началось: X++: ttsbegin; WHILE(TRUE) { SELECT FIRSTONLY current WHERE current.InvGuid == InvGUID; InvGUID = current.ParentInvGUID; SELECT FIRSTONLY parent WHERE current.ParentInvGUID == parent.InvGUID; if(parent) { //parentDistr.disableCache(); SELECT FIRSTONLY FORUPDATE parentDistr WHERE parentDistr.InvGUID == InvGUID && parentDistr.TransRecId == inventoryGuidInvoice.TransRecId //........... && parentDistr.JuridicalPersonId == inventoryGuidInvoice.JuridicalPersonId; if(parentDistr) { parentDistr.AMOUNTCUR += inventoryGuidInvoice.AmountCur;//слияние к предку //....... parentDistr.Update(); } else { parentDistr.data(InventoryGuidInvoice); parentDistr.InvGUID = parent.InvGUID; parentDistr.insert(); } } else { break; } current.clear(); } ttscommit; X++: while select { ttsbegin; select forupdate ttscommit; } X++: DO NOT: Hold database locks for longer than is necessary. DO: Limit the transaction scope by grabbing locks at the latest possible time and releasing locks as early as possible. X++: ttsBegin; while select ItemId from salesLine { select firstOnly forUpdate ItemType, ItemBuyerGroupId from inventTable where inventTable.ItemId == salesLine.ItemId; If (inventTable && (inventTable.ItemType == InventItemType::Item)) { inventTable.ItemBuyerGroupId = ; inventTable.update(); } } ttsCommit; X++: while select ItemId from salesLine { select firstOnly forUpdate ItemType, ItemBuyerGroupId from inventTable where inventTable.ItemId == salesLine.ItemId; If (inventTable && (inventTable.ItemType == InventItemType::Item)) { ttsBegin; inventTable.ItemBuyerGroupId = ; inventTable.update(); ttsCommit; } }
__________________
Axapta book for developer |
|
22.01.2014, 13:51 | #4 |
MCT
|
Собственно написал, что бы было понятно ищущим знаний коллегам.
__________________
Axapta book for developer |
|
22.01.2014, 14:00 | #5 |
Участник
|
Я считаю что при необходимости вполне можно транзакцию вне цикла открывать... но вот потенциально бесконечный цикл....блин...как вижу этот true так в дрожь))))
|
|
|
За это сообщение автора поблагодарили: MikeR (2). |
22.01.2014, 14:13 | #6 |
Дмитрий Ерин
|
MikeR, в ваших примерах из п. 4 и 5 идет обработка плоских данных, для которых отмена части транзакций не критична, ибо они могут быть выполнены позже простым повторным запуском того же кода. А в исходном алгоритме (п. 1) идет обход узлов дерева, причем выполняется операция +=. Если такой обход раздробить на мелкие транзакции, то при их частичном откате восстановить целостность данных будет невозможно физически (если явно не хранить историю обновления).
Ну а пример из п. 2 (while select...) неприменим для обхода дерева при заданной в п.1 структуре данных. Наверное это вам и пытаются сказать... PS: С тем, что п.5 более корректен в общем случае, чем п.4 - согласен.
__________________
|
|
22.01.2014, 14:44 | #7 |
Участник
|
тут вся загвоздка в слове necessary - устраивает ли тебя если в случае проблем с сетью половина строк обновится, а половина, нет
|
|
|
За это сообщение автора поблагодарили: macklakov (1), MikeR (5). |
22.01.2014, 15:58 | #8 |
Модератор
|
Или - готов ли ты поставить всю систему в интересную позу на продолжительное время блокировками на время обновления в одной транзакции и (если не срастется) повторять пока не получится
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: MikeR (2). |
22.01.2014, 16:18 | #9 |
Участник
|
Об этом тоже стоит подумать, но о целостности забывать не надо если разбиение на транзакции нарушает целостность надо вводить какие-то дополнительные структуры для того, чтобы она не нарушалась.
|
|
22.01.2014, 16:34 | #10 |
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 |
|
22.01.2014, 16:56 | #11 |
Британский учённый
|
По аналогии: Зачем делать бэкапы? Винчестеры довольно надежные, ломаются очень редко, вероятность отказа меньше 5%. А так экономия времени, места и админу проще
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
22.01.2014, 17:00 | #12 |
Участник
|
|
|
22.01.2014, 17:10 | #13 |
MCT
|
Скажем так, я переделал - работать стало ЗНАЧИТЕЛЬНО быстрее, сбоев не было вообще, проценты - это оценочное суждение
__________________
Axapta book for developer |
|
22.01.2014, 17:43 | #14 |
Moderator
|
Гм. Вы бы ссылочку на оригинальную тему дали, а то народ что-то ожесточенно обсуждает, а начала не видно...
|
|
22.01.2014, 17:52 | #15 |
Участник
|
В первом письме темы можно нажать на >> в цитате
|
|
22.01.2014, 18:18 | #16 |
MCT
|
Я бы добавил : "сражается не на жизнь, а на смерть..."
__________________
Axapta book for developer |
|
22.01.2014, 19:26 | #17 |
Участник
|
Может быть в данном конкретном случае то никогда не случится, а может быть это случится на следующей неделе - попробуй, например, запустить этот процесс с двух машин одновременно
|
|
22.01.2014, 19:46 | #18 |
Banned
|
Цитата:
Сообщение от MikeR
5 Корректный код X++: while select ItemId from salesLine { select firstOnly forUpdate ItemType, ItemBuyerGroupId from inventTable where inventTable.ItemId == salesLine.ItemId; If (inventTable && (inventTable.ItemType == InventItemType::Item)) { ttsBegin; inventTable.ItemBuyerGroupId = ; inventTable.update(); ttsCommit; } } Что мешает при той же оптимизации выбирать внутри транзакции? Не знаю, у меня глаза режет от такого. Почему бы не так: X++: while select ItemId from salesLine { select firstOnly ItemType, ItemBuyerGroupId from inventTable where inventTable.ItemId == salesLine.ItemId; If (inventTable && (inventTable.ItemType == InventItemType::Item)) { ttsBegin; [B]inventTable.forupdate(true);[/B] inventTable.ItemBuyerGroupId = ; inventTable.update(); ttsCommit; } } |
|
22.01.2014, 19:47 | #19 |
Модератор
|
Давайте для экономии времени будем исходить из того что разработчик по умолчанию знает что в данном случаем является минимальным скопом для транзакции (прошу прощения за англицизмы) и спор лишь о том стоит ли стараться придерживаться его в разработке или писать "как проще" - "ttsbegin в первой строке, ttscommit в последней" Я как человек который в итоге отвечает за весь инстанс в целом привык требовать чтобы код оттестированный в разработческой среде можно было запускать в продуктиве без переписывания (мелкие транзакции), бог весть чего в последний момент "наоптимизируют", но готов выслушать альтернативные точки зрения
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
22.01.2014, 21:22 | #20 |
MCT
|
Согласен, но это уже совсем мелкие детали.
Странно, что никто не заметил, что нет филд листа (тоже сорри за американизм/англицизм), слияния запросов, агрегирующей функции, но это тоже семечки, но на больших таблицах семечки уже серьезные. По while(true) и целостности вообще смотрю целая группировка даже существует.
__________________
Axapta book for developer Последний раз редактировалось MikeR; 22.01.2014 в 21:29. |
|
Теги |
базовая информация, транзакции |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|