Как решить проблемы с тупиками в движке InnoDB? - PullRequest
1 голос
/ 18 октября 2010

Я слышал об этой проблеме, и теперь я ищу более конкретную информацию?

Как это происходит, каковы причины этого, подробное объяснение механизма тупика, чтобы попытаться избежать его,Как обнаружить тупик, решить его и защитить данные от повреждения из-за этого.Случай при использовании MySQL с PHP.

А можно ли смешивать InnoDB и MyISAM?Я намереваюсь использовать innoDB для некоторых основных таблиц со многими связями и не так много данных, как пользователи, роли, привилегии, компании и т. Д., И использовать MyISAM для таблиц, которые содержат больше данных: данные клиентов, данные действий и т. Д.использовать только InnoDB, но переход от MyISAM пугает меня с точки зрения скорости и стабильности.А теперь это тупики: (

1 Ответ

2 голосов
/ 18 октября 2010

Возможны взаимоблокировки, если у вас есть два или более независимых запроса, обращающихся к одним и тем же ресурсам (таблицам / строкам) одновременно.Пример из реальной жизни:

Две механики работают на двух машинах.В какой-то момент во время ремонта они оба нуждаются в отвертке и молотке, чтобы ослабить какую-то плохо застрявшую часть.Механик A хватает отвертку, Механик B хватает молоток, и теперь ни один из них не может продолжить работу, поскольку второй необходимый им инструмент недоступен: они заблокированы.

Теперь люди умны, и один из механиковбудь милостив и передай свой инструмент другому: оба могут продолжать работать.Базы данных несколько глупы, и ни один запрос не будет любезным и не разблокирует любой ресурс, вызывающий тупик.В этот момент СУБД включит Рэмбо и принудительно откатит (или просто уничтожит) один или несколько взаимно заблокированных запросов.Это позволит одному счастливому запросу продолжаться и продолжать получать необходимые блокировки / транзакции, и, надеюсь, у прерванных есть достаточно умные приложения, обрабатывающие их, которые позже перезапустят транзакции позже.В более старых / более простых СУБД вся система остановилась бы до тех пор, пока администратор не вошел в систему и не выполнил некоторую ручную очистку.

Существует множество способов справиться с взаимоблокировками и вообще избежать их.Один большой из них - никогда не блокировать ресурсы в «случайных» порядках.В случае с нашими механиками, оба должны сначала потянуть за отвертку, прежде чем дотянуться до молотка.Таким образом, можно сразу же успешно работать, а другой будет знать, что ему нужно ждать.

Что касается смешивания InnodB / MyISAM - MySQL полностью поддерживает смешивание / сопоставление типов таблиц в запросах.Вы можете выбрать / присоединиться / обновить / вставить / удалить / изменить в любом порядке, в котором вы хотите, просто помните, что выполнение каких-либо действий с таблицей MyISAM в транзакции InnoDB НЕ сделает магически осведомленной транзакцию MyISAM.Части MyISAM будут выполняться / фиксироваться немедленно, и если вы откатите сторону InnoDB, MyISAM также не откатится.

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

...