У меня есть быстрый вопрос, который я не могу найти в Интернете, потому что не уверен, что использую правильную формулировку или нет.
База данных MySql автоматически синхронизирует запросы или поступает примерно в одно и то же время? Например, если я отправляю запрос на вставку чего-либо в базу данных, в то время как другое соединение отправляет запрос на выбор чего-либо из базы данных, MySQL автоматически блокирует базу данных во время вставки, а затем разблокирует, когда это сделано, позволяя выберите запрос, чтобы получить к нему доступ? Спасибо
"если я отправляю запрос на вставку чего-либо в базу данных в то же время, когда другое соединение отправляет запрос на выбор чего-либо из базы данных, MySQL автоматически блокирует базу данных во время вставки, а затем разблокирует, когда это будет сделано, разрешив запрос выбора чтобы получить к нему доступ? »Лучший ответ MySQL никогда не блокирует базу данных, таблица может быть заблокирована в зависимости от используемого движка таблиц, как прокомментировал @MadhurBhaiya.
@RaymondNijland Я предполагаю, что мой следующий вопрос будет заключаться в том, что если пользователь блокирует таблицу запросом LOCK, а затем другое соединение пытается получить доступ к этой таблице, будет ли запрос другого соединения просто ждать, пока таблица не будет разблокирована? Или запрос просто вернет ошибку
«если пользователь блокирует таблицу с помощью запроса LOCK, тогда другое соединение пытается получить доступ к этой таблице, будет ли запрос другого подключения просто ждать, пока таблица не будет разблокирована? Или запрос просто вернет ошибку», ответить на @Jeb сложно, потому что MySQL позволяет получать несколько блокировок READ для одной и той же таблицы из разных подключений / сеансов.






Ключом к пониманию того, как работает современный движок базы данных, такой как InnoDB, является Управление параллелизмом с несколькими версиями или MVCC. Это то, как одновременные операции могут выполняться параллельно, а затем согласовываться в согласованное «представление» базы данных при полной фиксации.
Если вы когда-либо использовали Git, вы знаете, как можно параллельно выполнять несколько обновлений одной и той же базы, но до тех пор, пока все они могут быть полностью объединены, конфликта нет. База данных работает точно так же, где вы можете начать транзакцию, применить кучу операций и зафиксировать ее. Если они применяются без конфликта, фиксация успешна. Если есть проблема, транзакция откатывается, как будто ее никогда не было.
Эта способность одновременно выполнять несколько операций - вот что делает механизм базы данных с поддержкой транзакций действительно мощным. Это важный компонент, необходимый для соответствия КИСЛОТНЫЙ стандарт.
MyISAM, исходный движок MySQL 3.0, не имеет ни одной из этих функций и блокирует всю базу данных при любой операции INSERT, чтобы избежать конфликта. Это работает так, как вы думали.
При создании базы данных в MySQL у вас есть выбор движка, но по умолчанию вы должны использовать InnoDB. На самом деле нет никаких причин использовать MyISAM, поскольку любые интересные функции этого движка (например, полнотекстовые индексы) были перенесены в InnoDB.
Do MySql databases automatically synchronize queries coming in at around the same time?
да.
Подумайте об этом так: одновременных запросов не существует. MySQL всегда сначала выполняет одну из них, затем вторую. (Это не совсем так; сервер намного сложнее. Но он надежно обеспечивает иллюзию последовательных запросов для нас, пользователей.)
Если из одного соединения вы выполняете один запрос INSERT или один запрос UPDATE, а из другого соединения вы выдаете SELECT, ваш SELECT получит согласованные результаты. Эти результаты будут отражать состояние данных до или после изменения, в зависимости от того, какой запрос был выполнен первым.
Вы даже можете делать такие вещи (операции чтения-изменения-записи) и поддерживать согласованность.
UPDATE table
SET update_count = update_count + 1,
update_time = NOW()
WHERE id = something
Если вам необходимо выполнить несколько операций INSERT или UPDATE, как если бы они были одним целым, вам нужно будет использовать механизм InnoDB, и вам нужно будет использовать транзакции. Транзакция заблокирует операции SELECT, пока она выполняется. Научить вас использовать транзакции выходит за рамки ответа на вопрос о переполнении стека.
Возможный дубликат В чем разница между MyISAM и InnoDB?