2015-01-19 2 views
0

Я не совсем уверен, что это возможно, так что хотелось бы уточнить, если это так, и если да, то какой путь вперед (чтобы предотвратить или не удалось смягчить).Возможная проблема между DELETE и INSERT в MySQL с PHP?

У меня есть PHP-скрипт, который позволяет отправлять пользовательские данные (что делает INSERT INTO) и другой PHP-скрипт (другой файл), который позволяет удалить указанные данные (что делает DELETE FROM), теперь позволяет сказать, что я удаляю и, случается, кто-то подает кое-что в одно и то же время - может ли это привести к игнорированию данных (оставшихся в этой таблице)?

Я искал и искал материал, относящийся к условиям гонки, - неуверенный, если это именно то, что назвал вышеперечисленный вопрос?

Если это помогает помещать вышеуказанное в контекст, пользователь может отправлять ответы (сообщения) в тему (что делает INSERT INTO forum_posts WHERE topic_id =?), И у меня есть возможность удалить тему (который, надеюсь, удалит все прикрепленные сообщения), т.е. DELETE FROM forum_topics WHERE topic_id =? а затем DELETE FROM forum_posts WHERE topic_id =?, если при выполнении удаления пользователь должен был как-то отправить ответ на эту тему, это может вызвать проблемы (поскольку у нас есть сообщение, которое существует без темы!).

Надеюсь, что это имеет смысл.

+0

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

+0

Или, возможно, использовать что-то, называемое _semaphore_ - флаг (который хранится где угодно, т. Е. В базе данных), который контролирует и должен предотвращать условия гонки. См. Http://en.wikipedia.org/wiki/Semaphore_%28programming%29. – Kleskowy

+0

@ Kleskowy Спасибо за это, не думайте, что у вас есть какой-то пример кодирования, чтобы начать меня, ссылка wikipedia охватывает тему, но не о том, как ее внедрить в PHP/MySQL? – Stone

ответ

0

Это именно то, для чего сделаны транзакции. Например (псевдо-код)

$db->beginTransaction(); 

// A set of queries; if one fails, an exception should be thrown 
$db->query('first query'); 
$db->query('second query'); 
$db->query('third query'); 

// If we arrive here, it means that no exception was thrown 
// i.e. no query has failed, and we can commit the transaction 
$db->commit(); 

Когда вы делаете commit все 3 операции выполняются одновременно без задержки, и не будет прерван другим пользователем удаляемого что-то

+0

Спасибо @ Oleg, я понимаю, что вы не знаете, что касается моего проекта, но я добавил дополнительную информацию, чтобы поставить свой вопрос в контекст (см. Выше). Как вы считаете, транзакции были бы более подходящими для скрипта PHP для удаления или для скрипта PHP для вставки или для обоих? Будет определенно больше исследований по этому поводу! – Stone

+2

Это не сработает, так как это не один вызов, который выполняет все запросы. Если я правильно ее понимаю, OP говорит о том, что пользователь A вставляет, а пользователь B удаляет одновременно. – giorgio

+0

@giorgio Это именно то, что я прошу! – Stone

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