AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.12.2010, 20:20   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от ice
все у вас правильно, только момент между 1 и 3 очень маленький и вероятность вклинивания 2 очень мала. а вот вероятность попадания в описанную мной ситуацию очень большая
Ничего подобного. Я просто описал тот процесс, который Вы и пытаетесь симулировать. Т.е. попытку "одновременного" создания записи двумя пользователями. Поскольку для процессора такого понятия в принципе не существует, то, с точки зрения процессора, эта самая "одновременность" будет разбита именно на описанные мною шаги.

Если подходить с точки зрения стороннего наблюдателя, то будет казаться, что выполняются следующие процессы

1. Оба пользователя "одновременно" открыли транзакцию
2. Оба пользователя "одновременно" выполнили поиск аналитики.
3. Оба пользователя "одновременно" ничего не нашли
4. Оба пользователя "одновременно" попытались создать новую запись. Один создал, другой "завис" до завершении транзакции первого пользователя
5. Первый пользователь завершил транзакцию, второй попытался создать запись - получил ошибку

Но поскольку "одновременность" - это иллюзия, создаваемая компьютером, то логично разбить процесс на понятные последовательные этапы. Что я и сделал в самом начале.

Однако во всей этой схеме "тонкий" момент - это момент поиска. Поиск осуществляется командой

select inventDim where ...

И вот тут-то и возникает вопрос настроек "по умолчанию". Причем настроек именно AOS.

Если настройки по умолчанию предполагают, что подобный запрос уйдет на сервер с хинтами грязного чтения, то 100% получим ошибку. И дополнительное соединение здесь никак не поможет. Поскольку в этом дополнительном соединении запрос также пойдет с хинатми грязного чтения

Если же настройки по умолчанию предполагают, что подобный запрос уйдет на сервер без дополнительных хинтов, то, если до завершения поиска одним пользователем, другой уже успел внести изменение, первый пользователь "повиснет" в ожидании завершения транзакции второго пользователя.

В этом случае сценарий будет похож на то, что описал S.Kuskov, но с одной существенной поправкой:

1. Оба пользователя "одновременно" открыли транзакцию
2. Оба пользователя "одновременно" начали поиск
3. Один из них закончил поиск первым и успел создать запись
4. Тогда другой "подвиснет" в процессе поиска и его поиск останется не завершенным до окончания транзакции первого пользователя
5. Первый пользователь завершил транзакцию
6. Второй пользователь продолжил поиск и нашел запись созданную первым
7. Второй пользователь также успешно завершил транзакцию

Конфликта вообще не будет. И это-то как раз наиболее вероятный сценарий. Поскольку полная "одновременность" завершения поиска двумя пользователями - это, скорее, исключительная ситуация. И дополнительное соединение здесь опять роли не играет, поскольку также будет ждать завершения транзакции первого пользователя.

А отсюда возвращаемся к вопросу

Цитата:
Сообщение от _scorp_
Может у Вас включены какие-то дополнительные хинты для SQL?

PS: Кстати, "случайно" режим кеширования таблицы InventDim не меняли?
Старый 22.12.2010, 21:36   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
дополнительное соединение здесь никак не поможет. Поскольку в этом дополнительном соединении запрос также пойдет с хинатми грязного чтения
Дополнительное соединение призвано изменить поведение не второго клиента (для него действительно принципиально ничего не измениться), а первого! Суть в том что если первый клиент не будет откладывать вставку нового значения в InventDim до завершения своей транзакции (используя дополнительное соединение это возможно, верно?), то к моменту когда второй клиент будет искать заданную комбинацию - он её найдёт(!). При этом основная транзакция первого клиента может быть ещё не завершена. Ещё раз, дополнительное соединение используется для выноса действий по вставке значения из основной транзакции (длинной) в отдельную (короткую).

Цель - получить следующую последовательность действий:
1. Первый пользователь открыл основную транзакцию
2. ...Первый пользователь открыл фоновую транзакцию в отдельном соединении
3. ...Первый пользователь в отдельном соединении выполнил findOrCreate
4. ...Первый пользователь подтвердил фоновую транзакцию (новая комбинация складских аналитик окончательно запостилась в таблицу)
5. Второй пользователь открыл свою транзакцию
6. Второй пользователь выполнил InventDim::find() - нашёл запись!
7. Второй пользователь подтвердил свою транзакцию
8. Первый пользователь подтвердил свою основную транзакцию

Последний раз редактировалось S.Kuskov; 22.12.2010 в 22:05.
Старый 22.12.2010, 22:03   #3  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,821 / 402 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Дополнительное соединение призвано изменить поведение не второго клиента (для него действительно принципиально ничего не измениться), а первого! Суть в том что если первый клиент не будет откладывать вставку нового значения в InventDim до завершения своей транзакции (используя дополнительное соединение это возможно, верно?), то к моменту когда второй клиент будет искать заданную комбинацию - он её найдёт(!). При этом основная транзакция первого клиента может быть ещё не завершена. Ещё раз, дополнительное соединение используется для выноса действий по вставке значения из основной транзакции (длинной) в отдельную (короткую).
да именно так. первая транзакция может длиться, например, несколько часов, а если расматривать время отдельной транзакции по вставке inventdim, то это произойдет гораздо быстрее, и к моменту чтения вторым клиентом, запись будет существовать
Старый 23.12.2010, 10:43   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от ice Посмотреть сообщение
первая транзакция может длиться, например, несколько часов, а если расматривать время отдельной транзакции по вставке inventdim, то это произойдет гораздо быстрее, и к моменту чтения вторым клиентом, запись будет существовать
Ааа, так речь идет о "длинных" транзакциях. Тогда был не прав. Не о том говорил. В этом случае действительно отдельное соединение поможет.

Правда пока не сталкивался с тем, чтобы тормоза вызывал именно процесс вставки одинаковых складских аналитик. Вероятно, это сильно зависит от бизнес-процессов.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вопросы по ReleaseUpdate DAX 2009 ansoft DAX: Программирование 7 31.08.2010 12:21
lookup для ItemId iz InventTable + InventDim + InventSum stalker25 DAX: Программирование 6 20.07.2009 15:50
inventUpd_reservation использование inventDim SHiSHok DAX: Программирование 2 31.03.2007 21:32
InventDim.findOrCreateBlank - простое сложно? Pavlo AKA Panok DAX: Программирование 5 25.10.2004 16:50
Работа с InventDim... NJD DAX: Программирование 11 17.06.2004 14:42
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:51.