MySQL запрос синхронизации / блокировки вопроса - PullRequest
0 голосов
/ 02 ноября 2018

У меня быстрый вопрос, который я не могу найти в Интернете, не уверен, что я использую правильную формулировку или нет.

База данных MySql автоматически синхронизирует запросы или поступает примерно в одно и то же время? Например, если я отправляю запрос на вставку чего-либо в базу данных одновременно, другое соединение отправляет запрос на выбор чего-либо из базы данных, MySQL автоматически блокирует базу данных, когда происходит вставка, и затем разблокирует, когда это сделано, позволяя выберите запрос для доступа к нему? Спасибо

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Базы данных MySql автоматически синхронизируют запросы, поступающие примерно в одно и то же время?

Да.

Думайте об этом так: одновременных запросов не бывает. MySQL всегда выполняет один из них сначала, затем второй. (Это не совсем так; сервер гораздо более сложен, чем этот. Но он надежно создает иллюзию последовательных запросов для нас, пользователей.)

Если из одного соединения вы запускаете один запрос INSERT или один запрос UPDATE, а из другого соединения вы запускаете SELECT, ваш SELECT будет получать согласованные результаты. Эти результаты будут отражать состояние данных до или после изменения, в зависимости от того, какой запрос был первым.

Вы даже можете делать такие вещи (операции чтения-изменения-записи) и поддерживать согласованность.

 UPDATE table 
    SET update_count = update_count + 1, 
        update_time = NOW()
  WHERE id = something

Если вам нужно выполнить несколько операций INSERT или UPDATE, как если бы они были одной, вам нужно будет использовать движок InnoDB и вам потребуется использовать транзакции. Транзакция будет блокировать операции SELECT во время выполнения. Обучение использованию транзакций выходит за рамки ответа о переполнении стека.

0 голосов
/ 02 ноября 2018

Ключом к пониманию того, как работает современный механизм баз данных, такой как InnoDB, является Multi-Version Concurrency Control или MVCC. Именно так одновременные операции могут выполняться параллельно, а затем согласовываться в согласованное «представление» базы данных при полной фиксации.

Если вы когда-либо использовали Git, вы знаете, как вы можете иметь несколько обновлений для одной и той же базы, происходящих параллельно, но при условии, что все они могут слиться друг с другом, нет конфликта. База данных работает так же, где вы можете начать транзакцию, применить несколько операций и зафиксировать ее. Если они применяются без конфликта, фиксация успешна. Если возникла проблема, транзакция откатывается так, как будто ее никогда не было.

Эта способность одновременно манипулировать несколькими операциями - это то, что делает движок базы данных с поддержкой транзакций действительно мощным. Это важный компонент, необходимый для соответствия стандарту ACID .

MyISAM, оригинальный движок из MySQL 3.0, не имеет ни одной из этих функций и блокирует всю базу данных при любой операции INSERT, чтобы избежать конфликта. Это работает так, как вы думали.

При создании базы данных в MySQL у вас есть выбор движка, но по умолчанию следует использовать InnoDB. На самом деле нет никакой причины использовать MyISAM, поскольку любые интересные функции этого движка (например, полнотекстовые индексы) были перенесены в InnoDB.

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