25.08.2010, 16:01 | #1 |
Участник
|
Одновременная вставка записей, совпадающих по индексу.
Билд 4.0.2503.1208, но насколько понимаю, тут вопрос вне версионный.
Для начала опишу модель архитектуры. Есть некоторый ф-ционал(предположим, что примитивный логгер показателей системы во время некого события). Метод для вызова логера находится внутри некого метода, для простоты будем считать, что это некоторый апдейт. Что-то вроде: X++: ttsbegin; //Инициализация только для примера. Суть в том, что до вызова логера должна //отработать одна часть процесса someBuffer.SomeField = SomeNewValue; someBuffer.SomeField2 = SomeNewValue2; someBuffer.SomeField3 = SomeNewValue3; //вызов логера Loger.logit(); //Вторая часть процесса после логера + окончательный апдейт. someBuffer.update(); ttscommit; Так вот, в чем суть, если процесс, в который внедрен вызов логера запускается одновременно на двух клиентах(а такая ситуация на проекте, увы, встречается в реальной практике) - происходит следующее: вылетает ошибка о невозможности записи в таблицу логера, так как запись существует, но худшее то, что при этом прерывается процесс. Что я только не делал: - и запись в лог в Try-catch обрамлял, наивно думая, что в такой ситуации должна инициироваться исключительная ситуация UpdateConflict(Хотя так же перепробовал и UpdateConflictNotRecovered и просто Error и вообще кэтч блок без фильтра), но увы, catch блок ничего ловится. - и OCC на таблице логгера отключил(эфект частичный, на 2-3 тестах отрабатывает хорошо, на 4ом все-равно валится). В итоге, у меня появился лишь один сомнительный вариант: сделать индекс по дате, пироду и под-периоду логирования неуникальным и потом чистить повторяющиеся варианты. В общем, если есть у кого более интересные идеи - милости прошу.
__________________
Axapta has seduced me deadly! |
|
Теги |
try/catch, исключения, как правильно, транзакции |
|
|