Тупик между выбором и усечением (postgresql) - PullRequest
0 голосов
/ 19 мая 2010

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

2010-05-19 14:43:17 UTC ERROR:  deadlock detected
2010-05-19 14:43:17 UTC DETAIL:  Process 25972 waits for AccessShareLock on relation  2495092 of database 16385; blocked by process 26102.
    Process 26102 waits for AccessExclusiveLock on relation 2494865 of database 16385; blocked by process 25972.
    Process 25972: SELECT * FROM "output_values" WHERE ("output_values".id = 122312)  LIMIT 1
    Process 26102: TRUNCATE TABLE "output_values_center1"

Ответы [ 2 ]

0 голосов
/ 20 мая 2010

Я бы попробовал это (в псевдокоде) для усечения:

#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;
  };
};

Таким образом, вы будете защищены от тупиков, поскольку родительская таблица будет исключительно заблокирована. Пользователь просто блокируется на долю секунды во время выполнения усечения и автоматически возобновляет работу после фиксации.

Но будьте готовы, что на загруженном сервере это может продолжаться несколько секунд, так как при использовании таблицы блокировка не будет выполнена и будет повторена попытка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...