2016-03-21 4 views
0

Проблема заключалась в том, что mysql работал на процессоре на нашем сервере и продолжался около 15 минут. В то время некоторые из данных, которые приходили на сервер, не были вставлены в db, но транзакция была совершена.MySQL пропустил строку при вставке новой записи

После перезагрузки проблема mysql была решена.

Таким образом, это означает, что даже при совершении транзакции в таблице не было новых строк. Доказательством этого является первичным ключом автоинкрементным, который должен выглядел следующим образом:

100 
101 
102 

Но в настоящее время, как это:

100 
102 

Так запись 101 не хватало, и его пропускаются.

Теперь мне нужно найти какой-то журнал для этой записи, если это существует.

Я пробовал в mysqldump log, но там нет записей. Запись 101 все еще отсутствует.

Мне нужно найти способ воссоздать эту транзакцию и сделать это снова.

У кого-нибудь были подобные проблемы?

код выглядит в основном так:

$db->autocommit(FALSE); 

$sql = "INSERT INTO t (amount, datetime) VALUES ($amount, '$datetime')"; 
$db->query($sql); 

$id = $db->insert_id; 
$sql = "INSERT INTO tr (id, log) VALUES ($id, '$log')"; 
$db->query($sql); 

$db->autocommit(TRUE); 

ответ

1

Сделка была прервана, скорее всего, после того, как последовательность была увеличивается уже. Это не проблема с точки зрения базы данных: для автоматического ввода индексов не требуется, чтобы все индексы были добавлены автоматически. С точки зрения кода/пользователя это тоже не должно быть проблемой. Если для вашего кода требуются непрерывные идентификаторы (скажем, для целей аудита), вам придется реализовать систему для этого самостоятельно. Если вы этого не требуете, просто запустите транзакцию еще раз. Затем будет создан идентификатор 103 (в вашем случае).

+0

В основном проблема заключалась в том, что клиент получил ответ от сервера, что все в порядке, и он получил свой билет. Но этот билет не на сервере, и его нет. Поэтому мне не нужны последовательные идентификаторы, и я просто сказал, что пропущенные идентификаторы являются доказательством того, что mysql пропустил строку при вставке и не выбрасывал никаких исключений. – madeye

+0

Похоже, что ваш код не проверял состояние транзакции: можете ли вы добавить код, выполняющий эту транзакцию? –

+0

Я обновил свой вопрос с кодом, но я не знаю, помогает ли это его основные вещи – madeye

Смежные вопросы