|
![]() |
#1 |
Участник
|
Цитата:
- что произойдет, если нерадивый админ кильнет aos32 на середине процесса обновления таблицы? (случится креш аоса, пропадение связи и прочее - кстати, код на сервере выполняется?) - что произойдет если два пользователя запустят этот процесс одновременно - используется ли на изменяемой таблице оптимистичная или пессимистичная блокировка и как измениться поведение "совсем уж мелких деталей" при этом. P.S. По моему опыту есть некий оптимум по скорости обновления записей и он может находиться где-то между "все записи сразу" и "каждая запись отдельно". Т.е. может быть более выгодно обновлять пакетами по n записей. |
|
![]() |
#2 |
MCT
|
2belugin я почему открыл обсуждение, что ОПТИМИСТИЧЕСКАЯ МОДЕЛЬ НЕ СОГЛАСУЕТСЯ С ЦЕЛОСНОСТЬЮ, даже inventTrans оптимистический. И ведомые языческами богами других систем народ продавливает производительность. Или давайте возвращаться к писиместической модели, и тогда код написанный нерадивым коллегой будет корректен. Почему нерадивым -у него посто куча разных ляпов, ключевое поле guid, допустим, об осталном уже писал. Он просто пытался подделать то, что знал из другой системы в аксапту. А здесь другая религия. Никто к пессимизму не вернется, так как по производительности будет полный провал. Хотя стоит отметить есть и другие реализации, но их мало.
__________________
Axapta book for developer |
|
![]() |
#3 |
Участник
|
Цитата:
Цитата:
Никто к пессимизму не вернется, так как по производительности будет полный провал.
|
|
![]() |
#4 |
MCT
|
Там, кстати по SQL север где ссылку положили есть такое определение:
" Если пользователь пытается изменить строку, то ее текущие значения сравниваются со значениями, полученными во время последней выборки этой строки. Если какое-либо значение изменилось, то сервер определяет, что другой пользователь или процесс уже обновил эту строку, и возвращает ошибку. Если значение остается прежним, то сервер выполняет изменение." http://technet.microsoft.com/ru-ru/l...ql.105%29.aspx В писсимистичесой модели все становятся в очередь и терпиливо ждут первый процесс, ну или какой там тормозит. Вот это я и имел в виду, что писсимистическая в плане целостности лучше работает, чем оптимистическая. То есть оптимистическая абортирует затормозившие процессы, без стыда и совести. ![]()
__________________
Axapta book for developer |
|
![]() |
#5 |
Модератор
|
Цитата:
Сообщение от MikeR
![]() В писсимистичесой модели все становятся в очередь и терпиливо ждут первый процесс, ну или какой там тормозит. Вот это я и имел в виду, что писсимистическая в плане целостности лучше работает, чем оптимистическая. То есть оптимистическая абортирует затормозившие процессы, без стыда и совести.
![]() ![]()
__________________
-ТСЯ или -ТЬСЯ ? |
|
![]() |
#6 |
Участник
|
Цитата:
У тебя свое определение целостности. http://en.m.wikipedia.org/wiki/Consi...tabase_systems) In database systems, a consistent transaction is one that starts with a database in a consistent state and ends with the database in a consistent state. Consistent state means that there is no violation of any integrity constraints. Consistency may temporarily be violated during execution of the transaction, but must be corrected before changes are permanently committed to the database. If the transaction would leave the database in an illegal state, it is aborted and an error is reported.[1] |
|
![]() |
#7 |
MCT
|
Итого резюмируя, как же все таки сделать озвученный код оптимальнее и с минимальными затратами, а так же с учетом фич, которые появились в AX 2012.
X++: While select InvGuid, ParentInvGUID,recId from current WHERE current.InvGuid == InvGUID Join RecId from parent WHERE parent.InvGUID == current.ParentInvGUID { SELECT FIRSTONLY RecId, AMOUNTCUR from parentDistr WHERE parentDistr.InvGUID == InvGUID && parentDistr.TransRecId == inventoryGuidInvoice.TransRecId //........... && parentDistr.JuridicalPersonId == inventoryGuidInvoice.JuridicalPersonId; //........... if(parentDistr.RecId) { update_recordset parentDistrUpd setting parentDistrUpd.AMOUNTCUR += inventoryGuidInvoice.AmountCur;//слияние к предку } else { RecordInsertList.add(InventoryGuidInvoice); } } X++: RecordInsertList.insertDatabase(); Я вообще считаю, что циклы должны быть конечными при любом раскладе, любое использование обратного приводит к некоторой расхлябанности в коде и как следствие падению производительности. Пусть лучше разработчик доказывает, что необходимо использовать именно while(true), чем закрывать на это глаза с самого начала. В принципе правильно спланированное приложение позволит выполнять запросы без while(true) и Left Join, на самом деле это уже вопрос более к архитектору приложения, нежели к разработчику. Про использование fieldList, соединений таблиц не говорю, так как этого полно можно прочитать в тренингах. PS Да и всеж таки код с таблицами tempDB будет с точки зрения целостности, за которую идет война не одну страницу, будет более правильным, в одной транзакции одной операцией. Единственный минус - создание дополнительных объектов в репозитарии. И не надо ждать ночи на пакетные задания ![]()
__________________
Axapta book for developer Последний раз редактировалось MikeR; 26.01.2014 в 19:40. |
|
Теги |
базовая информация, транзакции |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|