Spec-Zone .ru
спецификации, руководства, описания, API
|
Много ограничений существуют в MySQL Cluster относительно обработки транзакций. Они включают следующее:
Уровень изоляции транзакции. NDBCLUSTER
механизм хранения поддерживает только READ COMMITTED
уровень изоляции транзакции. (InnoDB
, например, поддерживает READ COMMITTED
, READ UNCOMMITTED
, REPEATABLE READ
, и SERIALIZABLE
.) Видят Раздел
17.5.3.4, "MySQL Cluster Backup Troubleshooting", для информации о том, как это может
влиять на поддержку и восстановление баз данных Кластера.)
Транзакции и BLOB
или TEXT
столбцы. NDBCLUSTER
хранилища только часть значения столбца, которое использует
любой из MySQL BLOB
или TEXT
типы данных в таблице, видимой к MySQL; остаток от BLOB
или TEXT
сохранен в отдельной внутренней таблице, которая не доступна для
MySQL. Это дает начало двум связанным проблемам, о которых следует знать, выполняясь SELECT
операторы на таблицах, которые содержат столбцы этих типов:
Для любого SELECT
от таблицы MySQL Cluster: Если SELECT
включает a BLOB
или TEXT
столбец, READ COMMITTED
уровень изоляции транзакции
преобразовывается в чтение с блокировкой чтения. Это делается, чтобы гарантировать
непротиворечивость.
Для любого SELECT
который использует поиск уникального ключа, чтобы получить любые столбцы, которые используют
любой из BLOB
или TEXT
типы
данных и это выполняются в пределах транзакции, совместно используемая блокировка чтения
сохранена на таблице для продолжительности транзакции — то есть, пока транзакция или не
фиксируется или прерывается.
Эта проблема не происходит для запросов, против которых использование индексирует или
сканирования таблицы, даже NDB
табличное наличие BLOB
или TEXT
столбцы.
Например, рассмотрите таблицу t
определенный следующим CREATE TABLE
оператор:
CREATE TABLE t ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT NOT NULL, c INT NOT NULL, d TEXT, INDEX i(b), UNIQUE KEY u(c)) ENGINE = NDB,
Любой из следующих запросов на t
вызывает совместно
используемую блокировку чтения, потому что первый запрос использует поиск первичного
ключа и второе использование поиск уникального ключа:
SELECT * FROM t WHERE a = 1;SELECT * FROM t WHERE c = 1;
Однако, ни один из четырех запросов, показанных здесь, не вызывает совместно используемую блокировку чтения:
SELECT * FROM t WHERE b 1;SELECT * FROM t WHERE d = '1';SELECT * FROM t;SELECT b,c WHERE a = 1;
Это - то, потому что этих четырех запросов первое использование индексировать
сканирование, вторые и третьи сканирования таблицы использования, и четвертое, используя
поиск первичного ключа, не получает значение любого BLOB
или TEXT
столбцы.
Можно помочь минимизировать проблемы с совместно используемыми блокировками чтения,
избегая запросов, которые используют поиски уникального ключа, которые получают BLOB
или TEXT
столбцы, или, в случаях, где такие запросы не
преодолимы, фиксируя транзакции как можно скорее позже.
Откаты. Нет никаких частичных транзакций, и никаких частичных откатов транзакций. Двойная ключевая или подобная ошибка заставляет всю транзакцию откатываться.
Это поведение отличается от того из других транзакционных механизмов хранения такой как InnoDB
это может
откатывать отдельные операторы.
Транзакции и использование памяти. Как отмечено в другом месте в этой главе, MySQL Cluster не обрабатывает большие транзакции хорошо; лучше выполнить много маленьких транзакций с несколькими операциями каждый чем делать попытку единственной большой транзакции, содержащей очень много операций. Среди других соображений большие транзакции требуют очень больших объемов памяти. Из-за этого транзакционное поведение многих операторов MySQL производится как описано в следующем списке:
TRUNCATE
TABLE
не является транзакционным когда использующийся на NDB
таблицы. Если a TRUNCATE TABLE
сбои, чтобы освободить таблицу, тогда это
должно быть запущено повторно, пока это не успешно.
DELETE FROM
(даже без WHERE
пункт), является
транзакционным. Для таблиц, содержащих очень много строк, можно найти, что
производительность улучшается при использовании нескольких DELETE FROM
... LIMIT ...
операторы, чтобы "разделить
удалить работу на блоки. Если Ваша цель состоит в том, чтобы освободить таблицу, то можно
хотеть использовать TRUNCATE
TABLE
вместо этого.
LOAD DATA
операторы. LOAD DATA
INFILE
не является транзакционным когда использующийся на NDB
таблицы.
Выполняясь a LOAD DATA INFILE
оператор, NDB
механизм выполняет фиксации в неправильных
интервалах, которые включают лучшему использованию коммуникационной сети. Не
возможно знать заранее, когда такие фиксации имеют место.
LOAD DATA FROM MASTER
ALTER TABLE
и транзакции. Копируя NDB
таблица как часть ALTER TABLE
, создание копии является нетранзакционным. (В
любом случае эта работа откатывается, когда копия удаляется.)
Транзакции и COUNT()
функция. При использовании
MySQL Cluster Replication не возможно гарантировать транзакционную непротиворечивость COUNT()
функция на ведомом устройстве. Другими словами, выполняя на
ведущем устройстве серия операторов (INSERT
, DELETE
, или оба), который изменяет число строк в таблице в пределах
единственной транзакции, выполняясь SELECT COUNT(*) FROM
запросы на ведомом устройстве могут привести
к промежуточным результатам. Это то, вследствие того, что table
SELECT COUNT(...)
может выполнить грязные чтения, и не ошибка в NDB
механизм хранения. (См. Ошибку #31321 для получения
дополнительной информации.)