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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.01.2014, 12:10   #1  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
В качестве факультатива - попробуйте найти в сиквеле команду на снятие блокировки

Кроме завершения транзакции
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 14:12   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от fed Посмотреть сообщение
А ты можешь привести какую-то ссылочку в подтверждение ?

Ну то есть - да - я понимаю что мы не можем заблокировать записи до того момента пока мы их не нашли и не прочитали. Но разве там система не вешает intent locks на более верхнем уровне до момента чтения ?
Вешает, но таблицу накладывается блокировка намерения на эксклюзивный доступ
Простым блокировкам обновления это не препятствует

Блокировка намерения обновления страниц вешается же при фетче - но она, опять же, не мешает блокировке строк

Цитата:
Сообщение от fed Посмотреть сообщение
Кроме того - как-то мне казалось что как раз при работе с серверными курсорами, система фетчит выборку, потом засовывает во временную таблицу в tempdb и потом по ней навигирует (естественно - заблокировав все скопированные записи в исходной таблице).
Нет, такого не встречал - выборка и фетч данных идет напрямую с таблиц, без перекачки куда-то еще (речь не идет о сложных запросах, результаты которых как раз и формируются в tempdb)


Что бы убедиться, можно сделать простой тест - запустить нижеприведенный код в разных сессиях одновременно, без прерывания паузы (во второй сессии сортировка в выборке должна быть в обратном порядке)
X++:
    InventTable inventTable;
    ;
    
    ttsbegin;
    
    select pessimisticLock inventTable
    order by itemId;
    //order by itemId desc; - для запуска во второй сессии
    
    pause;
    ttsabort;
Если записей в таблице достаточно, то в результате оба запроса вернут результат

Если же оба запроса будут запущены с одинаковой сортировкой, то один из запросов будет ожидать снятия блокировки ранее запущенным
__________________
Axapta v.3.0 sp5 kr2
Старый 24.01.2014, 14:25   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Вот, кстати, и ссылка Блокировка курсора
Речь там, правда, про курсоры TransactSQL, но к серверным курсорам это так же применимо (см. про динамические курсоры)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: fed (5).
Старый 26.01.2014, 22:22   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Eсли while убран, то этот код в отличие от исходного обновит только один уровень (например, если уипарента был еще парень). Цикл там все-таки был не зря, хотя while (true) это конечно code smell не потому, со он "бесконечный" а потому, что условия выхода написаны в необычном месте. С транзакциями стало непонятно - если одна общая(где-то раньше ttsbegin одно, если несколько, то другое.

Интересно также, что произойдет если две транзакции попробуют создать запись в distr одновременно
Старый 27.01.2014, 08:21   #5  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от belugin Посмотреть сообщение
С транзакциями стало непонятно - если одна общая(где-то раньше ttsbegin одно, если несколько, то другое.

Интересно также, что произойдет если две транзакции попробуют создать запись в distr одновременно
Как уже позже описал - из tempDB таблиц (одна на вставку, одна обновление) в одной транзакции
X++:
ttsbegin;

//update
//insert

ttscommit;
ЗЫ Хотя знаешь, update то придется опять таки в цикле делать
А ты что нибудь можешь предложить конструктивного?
__________________
Axapta book for developer

Последний раз редактировалось MikeR; 27.01.2014 в 08:56.
Теги
базовая информация, транзакции

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Коллеги, что вы думаете о данном коде? MikeR DAX: Программирование 36 21.01.2014 19:38
Странное поведение при закрытии склада-ошибка в коде? Aquarius DAX: Программирование 11 27.06.2013 13:37
.NET business connector не видит изменений в коде Аксапты rkorchagin DAX: Программирование 2 22.01.2010 11:43
Нужно сделать выборку из нескольких таблиц (в данном случае из четырех). niktata DAX: Программирование 10 30.09.2008 09:42
Можно ли в коде управлять свойством Mandatory? kostas DAX: Программирование 5 10.03.2004 11:14

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

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

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