У меня есть несколько таблиц MySQL (в первую очередь InnoDB и некоторые движки MyISAM), которые могут быть обновлены только путем усечения, а затем вставки данных. Я должен усечь данные, потому что у меня нет хорошего способа определить, какие данные могли быть удалены с момента последней синхронизации.
Моя проблема в том, что во время этого процесса возможно, что недостающие данные могут быть представлены пользователю. Как правило, эти таблицы маленькие, поэтому они должны быть заполнены в течение нескольких секунд самое большее. Должен ли я заблокировать таблицу перед усечением и разблокировать после повторной вставки данных? Если да, то как мне это сделать? И есть ли потенциальные подводные камни для этого метода?
Вот предложенный пример:
try {
$this->db_connection->beginTransaction();
$this->db_connection->query('LOCK TABLES my_table READ');
$this->db_connection->query('TRUNCATE TABLE my_table');
$this->db_connection->query('INSERT INTO my_table ...');
$this->db_connection->query('UNLOCK TABLES');
$this->db_connection->commit();
} catch (PDOException $ e) {
$ This-> db_connection-> RollBack ();
logError ('Необработанное исключение:'. $ e-> getMessage (). 'в файле'. $ e-> getFile (). 'on line'. $ e-> getLine ());
}
[/ NOEDIT]
Задача ещё не решена.
Других решений пока нет ...