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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.08.2010, 16:01   #1  
HorrR is offline
HorrR
Участник
 
340 / 30 (2) +++
Регистрация: 18.02.2008
Адрес: Киев
Одновременная вставка записей, совпадающих по индексу.
Билд 4.0.2503.1208, но насколько понимаю, тут вопрос вне версионный.

Для начала опишу модель архитектуры.

Есть некоторый ф-ционал(предположим, что примитивный логгер показателей системы во время некого события).

Метод для вызова логера находится внутри некого метода, для простоты будем считать, что это некоторый апдейт.
Что-то вроде:

X++:
ttsbegin;
//Инициализация только для примера. Суть в том, что до вызова логера должна
//отработать одна часть процесса
someBuffer.SomeField   = SomeNewValue;
someBuffer.SomeField2 = SomeNewValue2;
someBuffer.SomeField3 = SomeNewValue3;
//вызов логера
Loger.logit();
//Вторая часть процесса после логера + окончательный апдейт.
someBuffer.update();
ttscommit;
Loger.logit(); делает примерно следующее - пишет в таблицу лога показатели, если только таблица лога ещё не содержит записи, которая дублирует нашу по индексным полям. Для упрощения - эти поля дата логирования, период логирования и подпериод. Не спрашивайте зачем) Так нужно! В общем, эти поля формируют уникальный индекс - только одна запись за данную дату, период и подпериод логирования.

Так вот, в чем суть, если процесс, в который внедрен вызов логера запускается одновременно на двух клиентах(а такая ситуация на проекте, увы, встречается в реальной практике) - происходит следующее: вылетает ошибка о невозможности записи в таблицу логера, так как запись существует, но худшее то, что при этом прерывается процесс.

Что я только не делал:
- и запись в лог в Try-catch обрамлял, наивно думая, что в такой ситуации должна инициироваться исключительная ситуация UpdateConflict(Хотя так же перепробовал и UpdateConflictNotRecovered и просто Error и вообще кэтч блок без фильтра), но увы, catch блок ничего ловится.
- и OCC на таблице логгера отключил(эфект частичный, на 2-3 тестах отрабатывает хорошо, на 4ом все-равно валится).

В итоге, у меня появился лишь один сомнительный вариант: сделать индекс по дате, пироду и под-периоду логирования неуникальным и потом чистить повторяющиеся варианты.

В общем, если есть у кого более интересные идеи - милости прошу.
__________________
Axapta has seduced me deadly!
Теги
try/catch, исключения, как правильно, транзакции

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Множественная вставка записей Белов Владимир DAX: Программирование 9 16.10.2008 14:22
вывод количества записей в таблице на web форме и указание текущей страницы таблицы bambuk1960 DAX: Программирование 1 06.07.2006 13:27
Хранение отмеченных записей Pavel Pustovalov DAX: Программирование 9 17.05.2005 21:56
Вставка записей в аксапту из внешней БД Smith DAX: Программирование 2 20.09.2004 18:30

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

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

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