MySQL "потокобезопасен" из сценария php? - PullRequest
9 голосов
/ 02 марта 2012

Если у меня есть php-скрипт, который вызывает INSERT, UPDATE, DELETE и т. Д. Для соединения MySQL, и этот скрипт вызывается в неконтролируемое время операцией POST, всегда ли он «безопасен» (т. Е. Не приведет к повреждению таблицы или коллизии во время запросов)?

Например, если в течение 1 секунды поступило 500 запросов.

Если так, как php / mysql достигает этого?

Если нет, что нужно сделать, чтобы гарантировать «последовательный» доступ или безопасный одновременный доступ?

Ответы [ 6 ]

9 голосов
/ 02 марта 2012

MySQL использует блокировку (уровень таблицы для MyISAM или уровень строки для InnoDB), которая не позволяет 2 процессам (2 вызова сценария) изменять одну и ту же строку. Таким образом, таблица не будет аварийно завершать работу *, но возможно, что MySQL не сможет обработать количество запросов в повторное время, и запросы будут ждать. Вы всегда должны оптимизировать свои запросы так, чтобы они выполнялись максимально быстро.

* MyISAM может аварийно завершить работу при интенсивной вставке / обновлении приложений, но имеет автоматическое восстановление. Однако имейте в виду, что в таком приложении InnoDB имеет гораздо лучшую производительность

2 голосов
/ 02 марта 2012

MySQL использует блокировки для изоляции и транзакций для атомарности. Транзакции требуют InnoDB или BDB. InnoDB поддерживает полную поддержку ACID .

Блокировки и транзакции вместе решат проблему параллелизма.

По умолчанию MySQL имеет неявных транзакций .

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

2 голосов
/ 02 марта 2012

всегда ли это "безопасно" (т. Е. Не приведет к повреждению таблиц или коллизиям во время запросов)?

да

Если да, то какphp / mysql достигает этого?

блокировки таблицы / строки.

1 голос
/ 02 марта 2012

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

Для достижения этого результата вас может заинтересовать использование транзакций:

Примеры транзакций PHP + MySQL

0 голосов
/ 02 марта 2012

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

0 голосов
/ 02 марта 2012

Использовать транзакции ... См. это

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