2013-10-11 2 views
3

В настоящее время я создаю огромный массив базы данных со многими транзакциями. (Вставить, Обновить, Выбрать) с MySQL MyISAMMySQL Locking System

И я рассматриваю возможность использовать ТАБЛИЦУ LOCK TABLE и UNLOCK TABLE для чувствительных таблиц. Что произойдет, если:

Пользователь A имеет процесс обновления (сначала блокирует таблицу), и все еще не работает, пользователь B и пользователь C пытаются получить доступ к одной и той же таблице и строке (независимо от того, является ли это обновление/выбор).

  • Сможет ли B и C получить SQL-ошибку о блокировке таблиц?
  • Имеет ли MySQL время блокировки до того, как оно вернет ошибку? Если есть таймаут блокировки, как я могу проверить тайм-аут блокировки на моем сервере?
  • Лучшее решение, чем блокировка столов? Мы рассматриваем создание таблицы для очереди заданий. Но я думаю, что производительность будет очень плохой.

Эта таблица действительно чувствительна, и она будет перепутались, если я не могу предотвратить это

Спасибо за ваш ответ

+1

звучит для меня лучше использовать 'InnoDB', поскольку он поддерживает транзакции и блокировку на уровне строк. – Stephan

+0

MyISAM не может выполнять транзакции. Я предлагаю вам использовать MariaDB или Percona, который является более стабильным и имеет лучшие функции блокировки по умолчанию. Вам не нужно выполнять ручную блокировку. Возможность резервного копирования - это всегда 'backlog' и репликации. – DanFromGermany

+0

Вам нужно знать о типах двигателей и их причудах, или вы хотите проверить, какой лучший способ реализовать очередь заданий в соответствии с вашими спецификациями? –

ответ

1

Чтобы ответить на ваш вопрос - B & C блокируются до тех пор, пока не истечет время ожидания. Я не могу найти параметр таймаута для MyISAM прямо сейчас - он установлен в mysqld.conf для InnoDB.

Как говорили другие - InnoDB - лучший двигатель, если вам нужна поддержка транзакций.

Однако подумайте, действительно ли вам нужны замки. Они создают непредсказуемые узкие места в производительности, особенно в системах со многими параллельными пользователями. В то время как блокировки на уровне таблиц не должны приводить к страшному сценарию deadlock, блокировки на уровне таблиц означают, что только один процесс может использовать таблицу в любое время; если каждая операция базы данных занимает 1 секунду (небезопасно в огромных базах данных), более двух одновременных пользователей системы заметят ухудшение производительности; 10 одновременных пользователей увидели бы, что система становится очень медленной, особенно если вам нужно присоединиться к нескольким таблицам.

Сделка - это гораздо лучшее решение в большинстве случаев.

+0

Привет, Невилл, спасибо за ваш ответ. Что означает «B & C заблокированы»? Будет ли он в очереди (A будет работать, а затем B и C)? Или транзакция будет заблокирована и вернет ошибку? –

+0

Они будут ждать, пока замки не будут выпущены. Кажется, что не существует тайм-аута для MyISAM, поэтому они могут ждать вечно ... –

3

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

Также MyISAM не поддерживает операции и нуждается в ремонте вручную в случае суммирования таблицы.

0

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

Read here for INNODB locking mechanism

Read here for locking issues