20.01.2010, 09:46 | #21 |
Участник
|
Как вариант, понимая трагичность ситуации в этой процедуре, было бы логично сбрасывать кеш InventTable сразу после обнаружения ошибки в процедуре вставки.
Т.е. сделать что-то подобное: X++: void process(container) { // .... inventTable.insert(); if (- ) { flush inventTable; throw error(); } //.... } |
|
20.01.2010, 09:51 | #22 |
Участник
|
Цитата:
Чтобы не брать ответственность на себя это можно просто вынести как настройку производительности системы. А уж администратор пусть сам решает в каком режиме ему работать. |
|
20.01.2010, 10:17 | #23 |
Участник
|
Цитата:
Я думаю, что это очень сложно грамотно исправить на уровне МС.
Пришлось бы каким-то образом отслеживать на уровне ядра, какие записи вставлялись в этой транзакции, и удалять из кэша только эти записи - ведь прост очищать кэш тоже не очень кошерно |
|
20.01.2010, 11:29 | #24 |
NavAx
|
Цитата:
Думаю что достаточно будет при любых откатах транзакций сбрасывать кеш таблиц, в которые шла вставка. Похоже этого будет достаточно. - Простой и надежный вариант получился.
Вчера почему-то сброс кэша после очередной обработанной таблицы/неудачной транзакции не работал, сегодня после глобальной компиляции заработало. По методу вызова Dictionary::flushTable на сервере. Это по сути - тот же SysFlushData (который внутри тоже вызывает Dictionary::dataFlush), только с аргументом,позволяющим указать конкретную таблицу, см. мой предыдущий пост. Кстати, думаю, можно и чуть допилить SysFlushData чтобы он обращал внимание на args и если там что-то есть (tableId или record), то сбрасывал кэш только по нужной таблице. Впрочем, при наличии самого Dictionary::dataFlush(_tableId) это не очень-то и нужно.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|