Механизм блокировки mysql разделен на блокировки уровня таблицы и блокировки уровня строки.В этой статье я расскажу вам о том, как я делюсь и обмениваюсь общими блокировками и эксклюзивными блокировками в блокировках уровня строки в mysql.
Общие блокировки также называются блокировками чтения или сокращенно блокировками S. Как следует из названия, общие блокировки — это несколько транзакций, которые могут совместно использовать блокировку одних и тех же данных и могут получить доступ к данным, но они могут только читаться и не могут быть изменены.
Эксклюзивные блокировки также называются блокировками записи или блокировками X. Как следует из названия, монопольные блокировки не могут сосуществовать с другими. Например, если транзакция устанавливает монопольную блокировку на строку данных, другие транзакции не могут устанавливать другие блокировки на эту строку. , включая разделяемые блокировки и эксклюзивные блокировки, но транзакция, которая получает эксклюзивную блокировку, может читать и изменять данные.
Вы можете иметь хорошее представление о разделяемых блокировках, то есть множественные транзакции могут только читать данные и не могут изменять данные.Понимание монопольных блокировок у всех может быть несколько разным.Я вначале ошибся, думая, что после монопольной блокировки блокируется строка данных, прочее Транзакция не может прочитать и изменить строку данных, что не так. Исключительная блокировка означает, что после того, как транзакция добавляет монопольную блокировку к строке данных, другие транзакции не могут добавлять к ней другие блокировки. Оператор изменения данных по умолчанию для движка MySQL InnoDB, обновление, удаление, вставка автоматически добавит эксклюзивную блокировку к задействованным данным, оператор select по умолчанию не добавит какой-либо тип блокировки, если вы добавите эксклюзивную блокировку, вы можете использовать оператор select... for update , Чтобы добавить общий замок, вы можете использовать ... блокировка в инструкции режима общего доступа. Таким образом, строка данных с монопольной блокировкой не может изменять данные в других транзакциях, а данные не могут быть запрошены для обновления и блокировки в режиме общего доступа, но данные могут быть запрошены напрямую с помощью select...from..., потому что обычные запросы не имеют запорного механизма.
Сказав все это, давайте взглянем на следующий простой пример:
У нас есть следующие тестовые данные
Теперь у нас есть эксклюзивный запрос для строки данных с идентификатором = 1. Мы будем использовать начало открытия транзакции, не видя, как я закрываю транзакцию. Это для тестирования, потому что фиксация транзакции или откат транзакции снимает блокировку.
Открыть окно запроса
Часть данных будет запрошена, теперь откройте другое окно запроса и запросите те же данные двумя способами: эксклюзивный запрос и запрос общей блокировки.
эксклюзивный чек
общий чек
Мы видим, что и запрос монопольной блокировки, и запрос общей блокировки будут заблокированы, потому что данные с id=1 были добавлены с монопольной блокировкой, и здесь блокировка заключается в ожидании освобождения монопольной блокировки.
Что, если мы напрямую воспользуемся следующим запросом
Мы видим, что данные можно запрашивать.
Давайте еще раз взглянем на транзакцию, которая получает общую блокировку и может добавлять общие блокировки или не добавлять блокировки в других запросах.
Мы видим, что данные можно запрашивать, но их нельзя найти с монопольными блокировками, потому что монопольные и общие блокировки не могут существовать для одних и тех же данных.
Наконец, давайте проверим проблему автоматического добавления эксклюзивных блокировок в операторы обновления, удаления и вставки в упомянутом выше движке mysql InnoDb.
В это время общий запрос заблокирован, ожидая освобождения монопольной блокировки, но данные можно найти с помощью обычных запросов, потому что бесполезный механизм блокировки не является взаимоисключающим с монопольной блокировкой, а найденные данные являются старыми. данные до того, как данные будут изменены.
Затем мы отправляем данные и снимаем эксклюзивную блокировку, чтобы увидеть измененные данные. В это время мы можем использовать эксклюзивный запрос, общий запрос и обычный запрос, потому что данные этой строки снимают эксклюзивную блокировку после совершения транзакции. Только обычные запрос отображается ниже, другие студенты сами, чтобы проверить.
Вы можете видеть, что результат соответствует ожидаемому.
Вышеизложенное является моим личным пониманием общих и эксклюзивных блокировок в mysql.Если есть какие-то неправильные места, я надеюсь, что вы меня поправите.