|
![]() |
#1 |
Участник
|
В первом письме темы можно нажать на >> в цитате
![]() |
|
![]() |
#2 |
Участник
|
Вот ещё интересная реализация Модификация огромного количества (сотни тысяч) записей в Axapta 3.0 SP4
|
|
![]() |
#3 |
MCT
|
Цитата:
Сообщение от S.Kuskov
![]() Вот ещё интересная реализация Модификация огромного количества (сотни тысяч) записей в Axapta 3.0 SP4
Целостьность, которую ставили выше всего так же страдает!! ![]() ЗЫ может именно поэтому двенашка так сильно тормозит по сравнению с девяткой ![]() Однако, политкорректненько вы плюсы раздаете ![]()
__________________
Axapta book for developer Последний раз редактировалось MikeR; 23.01.2014 в 07:42. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
![]() |
#4 |
Участник
|
Примеры архитектурных решений:
Целостность данных при длительных запросах Kurt Hatlevik: Review of inventory II |
|
![]() |
#5 |
MCT
|
Цитата:
Сообщение от S.Kuskov
![]() Примеры архитектурных решений:
Целостность данных при длительных запросах Kurt Hatlevik: Review of inventory II ![]() Я это к тому, что и оптимистическая модель, так же не согласуется с целостностью. Первый держащий блокировку процесс идет лесом, какая уж тут согласованость и целостность. Однако тренд ныне популярный.
__________________
Axapta book for developer Последний раз редактировалось MikeR; 23.01.2014 в 09:06. |
|
![]() |
#6 |
Участник
|
Определение транзакции уже дает ответ на данный вопрос. И если каждое действие зависит от предыдущего - тогда делаем в одной транзакции, а если действия независимы - то какая разница? Произойдет бум в середине изменения состояния независимых записей - ну и ладно. Запустим заново и доделаем (в идеале, механизм проверки должен быть), иначе, транзакция по полной программе - зато данные в порядке.
![]() То есть, сейчас вы спорите просто о том, кто и как для себя видит 1 единицу действия сферического коня в вакууме... Ответ на вопрос зависит только от предпочтений и опыта программиста в в каждом конкретном случае. ![]() |
|
![]() |
#7 |
Талантливый разгвоздяй
|
ИМХО:
About locking and blocking in Dynamics AX and how to prevent it |
|
![]() |
#8 |
Участник
|
Цитата:
По мере обновления блокировки будут наоборот, накладываться. Это если будет использоваться оптимистическая модель блокировок При пессимистической в конечном счете, скорее всего, будет заблокирована вообще вся таблица (конечно, сильно зависит от распределения данных по компаниям)
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#9 |
Талантливый разгвоздяй
|
Цитата:
В таком случае, все записи сначала блокируются, затем система обновляет их все по порядку и в процессе обновления снимает блокировки следующим образом (оптимистичная модель):
Последний раз редактировалось Kabardian; 24.01.2014 в 10:23. |
|
![]() |
#10 |
Участник
|
Не, не понятно
![]() Блокировка, наложенная при обновлении, держится до момента окончания транзакции Независимо от модели блокировок Аксапты - сиквел об этом вообще ничего не знает
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#11 |
Участник
|
Если отпустить блокировку после обновления записи, но до коммита транзакции, то у конкурирующей транзакции может случиться "грязное чтение", например. Так что AndyD говорит все верно.
|
|
![]() |
#12 |
Талантливый разгвоздяй
|
Belugin, AndyD, может я и в самом чего-то не понимаю, процитирую статью About locking and blocking in Dynamics AX and how to prevent it (ссылку на нее давал выше):
|
|
![]() |
#13 |
Участник
|
График противоречит тексту над ним (выбираем без блокировки, при это после обработки 1/6 записей все они заблокированы)
|
|
![]() |
#14 |
Талантливый разгвоздяй
|
Цитата:
А это тогда о чем? (текст сразу под графиком) Цитата:
When using OCC the positive effect is obvious: There are much more rows available for updating (the olive bars). When we would have PCC the olive bars would not be available for updating, or in the words another process / tranaction would be blocked until all rows are processed. So when using OCC the chances for blocking is much smaller.
|
|
![]() |
#15 |
Участник
|
Там не написано про блокировки после апдейта ничего. OCC работает так:
Выбирает запись, запоминая его версию, дальше апдейтит, выставляя блокировку и проверяя что версия не изменилась. Если версия изменилась, то выбрасывает особый эксепшн. Блокировка держится до конца тразакции. Если бы этого не было, то возможен был бы следующий сценарий. Например некая транзакйия хочет выбрать две записи и их изменить. Если она не заблокирует первую запись до конца транзакции, то при этом другая транзакия сможет увидеть ее содержимое до конца первой транзакции и пойдет дальше с учетом этих грязных данных (dirty read). Первая транзакция может быть откатана, напрммер, потому что вторую запись успела изменить третья транзакция (после чтения первой и до сохранения). И тогда у нас будут в базе данные частично как будто первая транзакция завершилась успешно (в первой записи) в частично как будно нет (во второй) |
|
![]() |
#16 |
Участник
|
Угу, подписи перепутаны. Должно быть наоборот
Ко всему прочему, там нет ни слова о снятии блокировок после апдейта
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#17 |
Участник
|
Замечу так же, что при блокирующем чтении блокировки на выбираемые записи накладываются не на весь набор сразу, а по мере чтения записей.
Учитывая, что Аксапта использует серверные курсоры и данные вычитываются из таблицы порциями, картина блокировок будет не сильно отличатся от приведенной для оптимистического сценария. Только кол-во блокировок будет нарастать не пропорционально обновлению, а пропорционально чтению Естественно, это справедливо для случая обновления всех прочитанных записей и без эскалации блокировок
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#18 |
Участник
|
Переверните все-таки подпись к оси ординат и все встанет на свои места
![]() А в тексте предполагается единомоментное наложение блокировки при блокирующем чтении (что не соответствует действительности) - т.е. график будет в виде "кирпича", а не красивых ступенек, которые, якобы, уменьшают вероятность блокировок
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#19 |
Moderator
|
Цитата:
Сообщение от AndyD
![]() Переверните все-таки подпись к оси ординат и все встанет на свои места
![]() А в тексте предполагается единомоментное наложение блокировки при блокирующем чтении (что не соответствует действительности) - т.е. график будет в виде "кирпича", а не красивых ступенек, которые, якобы, уменьшают вероятность блокировок Ну то есть - да - я понимаю что мы не можем заблокировать записи до того момента пока мы их не нашли и не прочитали. Но разве там система не вешает intent locks на более верхнем уровне до момента чтения ? Кроме того - как-то мне казалось что как раз при работе с серверными курсорами, система фетчит выборку, потом засовывает во временную таблицу в tempdb и потом по ней навигирует (естественно - заблокировав все скопированные записи в исходной таблице). |
|
![]() |
#20 |
Талантливый разгвоздяй
|
Больше не могу теоретизировать на эту тему, вечером прогоню несколько сценариев обновления данных и отпишу результат.
Belugin, AndyD, спасибо за подробные ответы. |
|
Теги |
базовая информация, транзакции |
|
|