Я бы попробовал это (в псевдокоде) для усечения:
#define NOWAIT_TIMES 100
#define SLEEPTIME_USECS (1000*100)
for ( i=0; ; i++ ) {
ok = query('start transaction');
if ( !ok ) raise 'Unable to start transaction!';
queries = array(
'lock table output_values in access exclusive mode nowait',
'truncate output_values_center1',
'commit'
);
if ( i>NOWAIT_TIMES ) {
// we will wait this time, as we tried NOWAIT_TIMES and failed
queries[0] = 'lock table output_values in access exclusive mode';
}
foreach q in queries {
ok = query(q);
if (!ok) break;
}
if (!ok) {
query('rollback');
usleep(SLEEPTIME_USECS);
} else {
break;
};
};
Таким образом, вы будете защищены от тупиков, поскольку родительская таблица будет исключительно заблокирована. Пользователь просто блокируется на долю секунды во время выполнения усечения и автоматически возобновляет работу после фиксации.
Но будьте готовы, что на загруженном сервере это может продолжаться несколько секунд, так как при использовании таблицы блокировка не будет выполнена и будет повторена попытка.