Использование переводов MYSQL, основные вопросы - PullRequest
2 голосов
/ 28 августа 2011

Я новичок в программировании БД.Я везде читал, что могу использовать trasactions для отката своих действий, если у меня возникнет проблема в будущем.

Я хотел бы знать о транзакциях:

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

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

Заранее спасибо!

Ответы [ 5 ]

2 голосов
/ 28 августа 2011

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

Необходимо убедиться, что механизм хранения - InnoDB, в противном случае транзакции невозможны.Autocommit - это функция, которая существует только в подключающемся клиенте, она просто выдает коммит каждый раз, когда вы вносите изменения в БД.

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

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

2 голосов
/ 28 августа 2011
  1. Нет.Они позволяют запросам блокировать определенные части базы данных и позволяют ядру базы данных предоставлять унифицированное представление данных другим клиентам даже в обновляемых таблицах.

  2. Они видят данные такими, какими они были до того, как произошел соответствующий запрос, и им может быть запрещено записывать в таблицу.

Не все механизмы таблиц поддерживают транзакции, поэтому вам потребуетсяиспользуйте тот, который делает (например, InnoDB), и транзакции занимают ненулевое количество времени для обработки.

1 голос
/ 28 августа 2011

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

Блокировка транзакции зависит от механизма хранения и от уровень изоляции транзакции .MySQL / InnoDB использует управление версиями строк для реализации транзакций и снижает количество блокировок, используемых на всех уровнях изоляции, кроме сериализуемых.Уровень изоляции по умолчанию в MySQL - повторяемое чтение.

Обычно обновления используют блокировки записи, что означает, что другая транзакция не может обновить ту же строку, но может прочитать ее.Если вы попытаетесь получить доступ к заблокированной строке, MySQL будет ожидать истечения времени ожидания блокировки, а затем завершит запрос, сообщив, что истекло время ожидания блокировки.Обычно этого не должно происходить.Однако наиболее опасной частью использования транзакций является введение dead-locks - когда transaction A обновляет record1 и пытается обновить record2, который заблокирован transaction B - transaction B обновил record2 и пытаетсяобновите record1, но record1 заблокирован A, поэтому оба ждут друг друга.

Общий совет - сохранять транзакции как можно меньше и блокировать строки, которые вы собираетесь обновитькак можно раньше, чтобы предотвратить взаимоблокировку (вы можете использовать select ... для обновления для этого).

Много информации можно найти в документации MySQL и в Руководстве по сертификации MySQL.

1 голос
/ 28 августа 2011

Ответ 1. Нет. Блокирует части таблиц или полных таблиц в зависимости от характера запросов.Эти локаки могут быть заблокированы для чтения или записи.Ответ 2. Если пользователь хочет заблокировать часть таблицы, для которой другой пользователь имеет блокировку записи, пользователь задерживается до тех пор, пока блокировка не станет свободной.Если другой пользователь имеет блокировку чтения, и пользователь хочет блокировку записи, пользователь задерживается до тех пор, пока блокировка не станет свободной.Вам нужно прочитать о взаимоблокировках.

Надеюсь, это поможет.

1 голос
/ 28 августа 2011
  1. Простой ответ - Да.
  2. Ожидающий запрос будет ждать, пока таблица не будет заблокирована, а затем будет выполнен.

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

Кроме того, существует ряд запросов, которые могут выполняться одновременно, даже если они все находятся в разных таблицах. Если вы превысите это число, вы также получите блокировку. Вы можете проверить в phpmyadmin, сколько блокировок вы получили, чтобы узнать, есть ли проблемы с вашей обработкой БД.

Относительно транзакций: иногда вы хотите обновить базу данных частями информации. Это действительно зависит от вашего использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...