Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD-2007-0.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
2.68 Mб
Скачать

10.3. Уровни изоляции

Теоретически СУБД должна обеспечивать полную изоляцию транзакций. На практике вводятся несколько уровней изоляции, самый высокий из которых соответствует полной изолированности. В MySQL выбор уровня изоляции осуществляется с помощью инструкции SET TRANSACTION, которая в соответствии со стандартом определяет четыре уровня изоляции. Ниже они перечислены в порядке от наименьшей степени изоляции к наибольшей:

  • READ UNCOMMITTED (незавершенное считывание). Допускается чтение данных (только в режиме считывания READ ONLY), когда одна, еще не завершенная, транзакция модифицирует строку таблицы, а другая транзакция читает эту строку. Здесь транзакция может читать данные из таблиц напрямую, не проверяя, окончательные это данные или нет. Другим потокам разрешено менять содержимое этих таблиц, не дожидаясь завершения транзакции. Если первая транзакция будет отменена, то окажется, что вторая транзакция получила данные, которые никогда не существовали.

  • READ COMMITTED (завершенное считывание). Здесь разрешено читать только подтвержденные (т.е. окончательные) данные. Изменения, вносимые другими потоками, не отразятся в запросе на выборку до тех пор, пока они не будут зафиксированы. Тем не менее, по-прежнему существует возможность того, что один и тот же запрос, выполненный дважды в ходе одной транзакции одним пользователем, выдаст разные результаты, так как между первым и вторым запросом другой поток может успеть выполнить собственную транзакцию.

  • REPEATABLE READ (повторяемое считывание). Любая строка, читаемая или обновляемая в ходе транзакции, не может быть изменена другим потоком. Транзакция может заблокировать все записи, с которыми она работает, и значения, извлекаемые инструкцией SELECT, никогда не меняются в течение транзакции. Однако она не может помешать другой транзакции добавлять строки. Если в ходе одной транзакции вводятся два запроса на выборку, а между ними другая транзакция добавляет в таблицу новую строку, то эта новая строка становится «призраком», который внезапно появляется в ходе первой из транзакций.

  • SERIALIZABLE (способность к упорядочению). Транзакции принудительно выполняются одна за другой. Несколько потоков могут начинать транзакции одновременно, но если окажется, что две транзакции пытаются обновить одну и ту же строку, одна из них будет объявлена проигравшей в тупиковой ситуации и отменена. Это наивысший уровень целостности данных. Именно такое поведение рекомендуется в стандарте SQL.

Все виды транзакций, кроме последней, не гарантируют сохранности и целостности базы данных.

10.4. Выполнение транзакций

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

  • можно отключить режим автозавершения с помощью инструкции SET. Инструкция SET AUTOCOMMIT = {0 | 1} определяет, должна ли программа MySQL немедленно фиксировать изменения, вносимые запросами, или необходимо дожидаться завершения транзакции. По умолчанию данная опция включена (AUTOCOMMIT = 1);

  • либо воспользоваться инструкцией BEGIN, которая начинает новую транзакцию.

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

Транзакции применимы не ко всем, а лишь к некоторым типам таблиц. Для стандартного типа MyISAM транзакции не поддерживаются. Попытка обновить таблицу типа MyISAM в рамках транзакции просто приведет к немедленному обновлению таблицы. Это изменение уже нельзя будет отменить.

Если транзакции используются довольно часто, можно изменить стандартный тип таблиц, отредактировав файл конфигурации MySQL (т.е. файлы my.ini или my.cnf для Windows NT) для утилиты mysqld или введя соответствующую опцию при запуске сервера. По умолчанию предполагается таблицы типа MYISAM, однако этот тип можно сменить, используя опцию

--default-table-type=тип

и задать использование таблиц типа Berkley DB, Gemini и InnoDB, ориентированных на применение транзакций.

Транзакция отменяется с помощью инструкции ROLLBACK. При этом отменяются все изменения, сделанные в ходе текущей транзакции.

Если же необходимо принять изменения, можно воспользоваться инструкцией COMMIT. Инструкция объявляет все изменения, сделанные в ходе транзакции, постоянными.

В транзакции разрешается обновлять таблицы, но только с помощью инструкций INSERT и UPDATE. Изменения схемы базы данных выполняются вне транзакций. Когда вводится инструкция, вносящая изменение в схему, текущая транзакция тут же завершается. К завершению транзакции приводят следующие инструкции: ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE, DROP TABLE, RENAME TABLE, TRUNCATE.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]