SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.05.2008 20:27:09

Pirate77
Завсегдатай
Зарегистрирован: 12.05.2008
Сообщений: 33

Sql запросы

Допустим несколько пользователей одновременно хотят вставить даные(Insert) в таблицу что нужно сделать чтобы несколько запросов запущенных одновременно  выполнились корректно

Неактивен

 

#2 23.05.2008 04:10:19

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Sql запросы

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

Подробнее см. http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

В случае использования механизма хранения InnoDB реализуется еще более гибкая политика - транзакции, основанные на мультиверсионности таблиц, что зачастую позволяет полностью развести запросы к одной таблице, идущие к разным ее строкам, а также одновременные INSERT'ы.
Подробнее об этом см. http://dev.mysql.com/doc/refman/5.1/en/ … model.html

Неактивен

 

#3 23.05.2008 06:42:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Sql запросы

Немного о блокировках в MySQL

Чтение блокирует запись, но не другое чтение
Запись блокирует и запись и чтение
Блокировка может быть явная или неяная:
1) неявно устанавливает сервер на время выполнения одного выражения. Уровень блокировки зависит от хранилища:
    -) MyISAM, MEMORY, MERGE -- table level
    -) BDB -- page level
    -) InoDB -- row level
2) явно (LOCK TABLES, UNLOCK TABLES) указывает клиент. Блокировка уровня table.
Для блокировки уровня таблицы не может возникнуть "deadlock" за исключением использования курсоров.


Для явной блокировки выгрыш производительности за счет однократного назначения блокировки и отключения перестройки индексов на время блокировки.
Указывается имя таблицы и тип блокировки:

LOCK TABLES Country READ, City WRITE;

UNLOCK TABLES; не имеет аргументов, освобождает все таблицы.
Пока клиент удерживает явную блокировку, он не может использовать другие таблицы, поэтому блокировать нужно сразу всё что понадобиться (одним выражением).
LOCK TABLES отменяет сделанные тобой ранее блокировки!

Типы блокировок:
-) READ
-) WRITE
-) READ LOCAL - позволяет другим INSERT, только если таблица типа MyISAM и не имеет дыр (запись идет в конец таблицы).
-) LOW_PRIORITY WRITE  - пропускает всех кто хочет установить READ LOCK.

Разрыв соединения снимает блокировку.
Блокировка таблиц может быть нарушена транзакцией и наоборот. START TRANSACTION неявным образом осуществляет UNLOCK TABLES и наоборот LOCK TABLES прерывает незаконченную транзакцию.
Для установки блокировки таблица должна быть свободна от блокировок, нужно иметь привилегии LOCK TABLES и SELECT на каждую таблицу.


InnoDB поддерживает 2 модификатора, влияющих на механизм блокировки, добавляются в конце оператора SELECT.
1) LOCK IN SHARE MODE  -- все выбранные строки блокируются с помощью shared lock (общая блокировка). Другие транзакции могут читать, но не могут изменять эти строки пока первая транзакция не снимет блокировку.
2) FOR UPDATE -- все выбранные строки блоктруются с помощью exclusive lock.  Другие не могут ни читать, ни изменять.


P.S. Коллеги, что ещё можно добавить про блокировки? Думаю позже написать статью.

Неактивен

 

#4 23.05.2008 07:16:35

EugeneTM
Гуру
Зарегистрирован: 11.04.2008
Сообщений: 89

Re: Sql запросы

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

Следующий вопрос - какая целевая аудитория?
Если новички, то по моему нужно иллюстрировать простыми и наглядными примерами. Что-то вроде того что в конце топика
http://www.php.ru/forum/viewtopic.php?p … ght=#98118

А еще лучше для них комикс. Это самое наглядное объяснение работы join, которое я видел
http://www.codinghorror.com/blog/archives/000976.html

Транзакции за собой тянут шлейф. Необходимо описание обработки ошибок ...
А если на сервере первичную обработку делать, то лучше это в ХП ...
Короче книжка получается.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson