19.10.2011, 19:48 | #1 |
Участник
|
Развалились InventSum - InventTrans
Обнаружил интересную особенность :
Код обновляющий, InventSum (если быть точнее - пишущий данные об изменения в InventsumDelta - но в данном случае это непринципиально) для методов InventTrans.insert() InventTrans.delete() расположен после Super() а для InventTrans.update() до Super() что приводит в ряде случаев к тому, что расходятся данные InventSum - InventTrans. Например : в коде есть вызов такого типа : X++: ... ttsBegin; try { // здесь расположен код обновляющий InventTrans - например комплектация или резервирование } catch(Exception::Error) { // обработка } catch { // сюда попадает обработка конфликта обновления записи // ничего не делаем } ttsCommit; ... информацию в InventSumDelta успеет выполниться и транзакция не откатывается (такова особенность этого исключения). Далее после коммита транзакции изменения сбрасываются в InventSum, а Inventtrans не изменился. Получаем расхождения. Можно конечно возразить что пример несколько искусственный, но мы на практике с этим столкнулись. Получается, что отсутствие отката транзакции при Exception::UpdateConflict - достаточно опасная вещь. По крайней, мере лучше всегда этот тип исключения обрабатывать. А еще лучше поправить метод InventTrans.update(), переместив обновление InventSumDelta после вызова super(). Это будет дополнительной защитой от небрежно написанного кода. Правда все последствия такого переноса пока не изучил. Как думаете, рискуем чем нибудь ? Последний раз редактировалось Logger; 19.10.2011 в 19:50. |
|
|
За это сообщение автора поблагодарили: Pustik (3). |
Теги |
exception, inventsum, inventtrans, occ, try/catch, баг, исключения |
|
|