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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2008, 00:29   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Ax3sp3 vs Ax4sp2 на примере
Решил зафиксировать результаты небольших опытов, проведенных на приложениях Ax3sp3 и Ax4sp2 подключенных к серверу MS SQL2005 с БД в режиме 90.

В опытах принимают участие: табличка
aTable с полями
Id - int с уникальным индексом
Value - int без индекса

и 2 жобика
X++:
static void Job_b1(Args _args)
{
    aTable  aTable;
    ;

    ttsbegin;
    aTable = aTable::find(12, true); // такая запись есть
    aTable.Value = timenow();
    aTable.update();
    ttscommit;
}

static void Job_b2(Args _args)
{
    aTable  aTable;
    ;

    select aTable
        where aTable.Value == 200; // такой записи нет

    ttsbegin;

    select aTable
        where aTable.Value == 200;

    aTable = aTable::find(12, true);
    aTable.Value = timenow();
    aTable.update();

    ttscommit;
}
Опыт 1
Запускаем 2 клиента аксапты.
В одном из них ставим точку останова на строке aTable.update(); первого джобика и выполняем.
Во втором выполняем джобик2 по шагам.
Ax3sp3 - джобик2 вешается на строке aTable = aTable::find(12, true); до тех пор пока не закончится джоб1.
Ax4sp2 - джоб2 отрабатывает до конца, однако при попытки продолжить джоб1 получаем ошибку:
Невозможно отредактировать запись в aTable (aTable).
Возник конфликт обновления из-за того, что другой пользовательский процесс выполняет удаление записи или изменение одного или нескольких полей в записи.


Опыт 2
Запускаем 2 клиента аксапты.
В одном из них ставим точку останова на строке ttscommit; первого джобика и выполняем.
Во втором выполняем джобик2 по шагам.
Ax3sp3 - на этот раз джобик2 вешается на строке select aTable where aTable.Value == 200; (которая после ttsbegin) до тех пор пока не закончится джоб1.
Ax4sp2 - теперь и здесь джоб2 вешается, но на строке aTable.update(); до тех пор пока не закончится джоб1, а потом выдает туже ошибку:
Невозможно отредактировать запись в aTable (aTable).
Возник конфликт обновления из-за того, что другой пользовательский процесс выполняет удаление записи или изменение одного или нескольких полей в записи.

Последний раз редактировалось Wamr; 30.09.2008 в 00:33.
Старый 30.09.2008, 07:56   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
а вывод какой?
__________________
полезное на axForum, github, vk, coub.
Старый 30.09.2008, 10:23   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Wamr Посмотреть сообщение
Решил зафиксировать результаты небольших опытов, проведенных на приложениях Ax3sp3 и Ax4sp2 подключенных к серверу MS SQL2005 с БД в режиме 90.
Разве Ax3sp3 может работать с SQL2005 в режиме 90 ? Вы ничего не путаете ? Может имелась в виду Ax3KR3 ?
Старый 30.09.2008, 10:40   #4  
CDR is offline
CDR
MCTS
MCBMSS
 
236 / 175 (6) ++++++
Регистрация: 27.11.2003
Для полноты картины можно скачать проектик отсюда и из третьего клиента посмотреть, какие ресурсы блокирует SQL сервер при выполнении каждой строки джобиков.

А еще лучше и проще почитать документацию по 4-ке
Старый 30.09.2008, 10:41   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
То есть ты хочешь сказать, что точка останова влияет на исполнение запроса?
Что-то слабо верится...
Но попробую на досуге
Старый 30.09.2008, 10:44   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Wamr Посмотреть сообщение
Опыт 2
...
Ax3sp3 - на этот раз джобик2 вешается на строке select aTable where aTable.Value == 200; (которая после ttsbegin) до тех пор пока не закончится джоб1.
Интересно почему ?
Блокировка на странице индекса оказалась ? А откуда ей взяться ? Ведь уровень изоляции транзакции ReadCommited, а не Serialized. Блокировки по строке не должно быть - записи то нет. Либо возможно блокировка легла на страницу или таблицу.
Старый 30.09.2008, 10:46   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
То есть ты хочешь сказать, что точка останова влияет на исполнение запроса?
Не ...
Там просто точкой останова регулируется, проходил update строки или нет. Соответственно разное поведние 4-ки и 3-ки.

Табличка кстати, судя по поведению, настроена на оптимистическую модель конкуренции.

Последний раз редактировалось Logger; 30.09.2008 в 11:19.
Старый 30.09.2008, 10:56   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Из приведенного описания можно сделать такие выводы:

Ax3sp3

Внутри открытой транзакции все запросы, по умолчанию, не явно, добавляют хинт forupdate и блокируют считываемую запись

Ax4sp2

Либо криво написан метод aTable::find(), либо не работает настройка aTable.selectForUpdate(_update);.
Старый 30.09.2008, 11:13   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Попробовал на Ax3KR3 Oracle 9

1-й опыт - все как описано.
2-й опыт - повис во 2-м джобе на
X++:
   aTable = aTable::find(12, true);
что и следовало ожидать.

Оракл рулит !

Интересно, а как с этим экспериментом в SQL2008 ?
Старый 30.09.2008, 11:16   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Из приведенного описания можно сделать такие выводы:

Ax3sp3

Внутри открытой транзакции все запросы, по умолчанию, не явно, добавляют хинт forupdate и блокируют считываемую запись
Сомнительно (автор указал что записи со значением 200 - нет - если блокировка на запись накладывается, то блокироваться нечему). Скорее там блокировка лишняя накладывается где-то, напрмер на страницу или таблицу. А реально надо смотреть на сервак что происходит. К сожалению нет под рукой SQL2005

Последний раз редактировалось Logger; 30.09.2008 в 11:36.
Старый 30.09.2008, 14:17   #11  
Alexius is offline
Alexius
Участник
Аватар для Alexius
 
461 / 248 (9) ++++++
Регистрация: 13.12.2001
1. В методах find на таблицах часто используется конструкция:
X++:
...
myTable.SelectForUpdate(update); 
select myTable where myKey = key;
...
где переменная update = true для выборки записи под обновление.

В Ax3sp3 : при выполнении сразу блокируется запись (страница, таблица) на обновление, т.е. в запросе на SQL сервер присутствует хинт UPDLOCK.

В Ax4sp2 : такой блокировки не происходит.

2. В Ax3sp3, при настройках по умолчанию, вне транзакции используется грязное чтение (READ UNCOMMITED), а внутри чистое (READ COMMITED)

В Ax4sp2 : используется только чистое чтение (READ COMMITED)
Старый 30.09.2008, 14:38   #12  
mono is offline
mono
Участник
 
18 / 10 (1) +
Регистрация: 26.10.2006
Цитата:
Сообщение от Wamr Посмотреть сообщение
В опытах принимают участие: табличка
aTable с полями
Id - int с уникальным индексом
Value - int без индекса[/I]
Думаю, что если отключить OCC для таблицы "aTable", то поведение AX4SP2 не будет отличаться от AX3SP3. Как говорится RTFMMF.
За это сообщение автора поблагодарили: Wamr (-1).
Старый 01.10.2008, 00:51   #13  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Сергей,
выводы каждый может сделать сам, мне показался интересным результат, который я и положил в общий доступ, так чтобы можно было перечитывать и думать... в свободное время

Logger,
именно SP3 (без KR3)
поиск по неиндексированому полю = TableScan, а значит и подвисание на заблокированной строке при уровне изоляции ReadCommited

CDR, спасибо, но мне пока и sp_lock хватает

Иван,
уровень блокировки на строку поднимается до эксклюзивного после выполнения update

Владимир,
я бы сказал, что в ax3sp3, запрос выполненный за пределами транзакции равноценен запросу в транзакции с хинтом selectLocked(false), то бишь NOLOCK
Это можно назвать одним из выводов


Отключение OCC на таблице делает ax4sp2 похожим на ax3sp3+Oracle9, а не ax3sp3+SQL2005
Старый 09.10.2008, 23:12   #14  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
продолжение
Проверил AX4sp2 с отключённым OCC.

Опыт 1 + Опыт 2
джобик2 вешается на строке aTable = aTable::find(12, true); до тех пор пока не закончится джоб1.


Аналогично себя ведет Ax3sp3 с Oracle9
и Ax3sp3 с SQL2005 при включении на БД snapshot isolation (не тестированное сочетание)
Теги
производительность, ax3.0, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Зачем нужен BP если ему не кто не следует? на примере NetBus DAX: Программирование 18 20.11.2008 07:53
Формирование цены товара с учетом скидок и дисконтов на примере заказа на продажу rusalaudinov DAX: Программирование 3 21.03.2008 13:39
Тестирование прав доступа в Ax 4.0 Ivanhoe DAX: Администрирование 27 14.12.2007 17:55
Как реализовать Query или View на примере такого T-SQL запроса для OLAP? sao DAX: Программирование 9 07.10.2005 18:57
Конфигурир Спецификац на примере Ахапки Alex_R2 DAX: Функционал 4 27.07.2005 15:40
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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