MySQL INSERT и SELECT Порядок приоритета - PullRequest
2 голосов
/ 16 мая 2010

если INSERT и SELECT выполняются одновременно для таблицы MySQL, какая из них будет первой?

Пример. Предположим, что количество строк в таблице users равно 0.

Затем эти два запроса выполняются в одно и то же время (предположим, что они в одну и ту же мили / микросекунду):

INSERT into users (id) values (1)

и

SELECT COUNT(*) from users

Будет ли последний запрос возвращать 0 или 1?

Ответы [ 2 ]

5 голосов
/ 16 мая 2010

Зависит от того, является ли ваша таблица users MyISAM или InnoDB.

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

Если это InnoDB, он основан на транзакциях. Архитектура с несколькими версиями обеспечивает одновременный доступ к таблице, и SELECT будет видеть количество строк на момент начала транзакции. Если одновременно происходит INSERT, SELECT увидит 0 строк. Фактически, вы можете даже увидеть 0 строк на SELECT, выполненных несколько секунд спустя, если транзакция для INSERT еще не зафиксирована.

Невозможно запустить обе транзакции по-настоящему одновременно. Транзакции гарантированно имеют некоторый порядок.

2 голосов
/ 16 мая 2010

Зависит от того, какой оператор будет выполнен первым. Если первое, то второе вернет 1, если второе выполнит первое, то вернет 0. Даже если вы выполняете их на компьютере с несколькими физическими ядрами, и из-за механизма блокировки они никогда не будут выполняться точно так же отметка времени.

...