Необходимые базы пессимистичных замков и оптимистичных замков для интервью

база данных
Необходимые базы пессимистичных замков и оптимистичных замков для интервью

предисловие

в предыдущей главе5 минут, чтобы понять изоляцию транзакций и уровень изоляцииНаконец, собственно, мы уже упоминали понятие замков. В этой главе в основном будут представлены следующие базы данных悲观锁与乐观锁соответствующие знания. Если есть какие-либо ошибки, пожалуйста, укажите на них вовремя ~

Эта статья была синхронизирована сGitHub/Gitee/Общедоступный номер, заинтересованные студенты помогают подписаться~

вопрос:

  • Зачем нужны замки?
  • Что такое пессимистическая блокировка?
  • Что такое оптимистическая блокировка?
  • В чем разница и связь между пессимистической блокировкой и оптимистичной блокировкой?
  • Каковы сценарии использования пессимистической блокировки и оптимистичной блокировки?

Зачем нужны замки?

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

1. Пессимистический замок

1.1 Определения

Энциклопедия Байду:

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

Другие точки знаний

Пессимистическая блокировка в основном共享锁или排他锁 共享锁Также известные как блокировки чтения или S-блокировки для краткости, как следует из названия, общие блокировки — это несколько транзакций, которые могут совместно использовать блокировку одних и тех же данных и иметь доступ к данным, но могут только читать и не могут изменять их.排他锁Исключительная блокировка, также известная как блокировка записи или сокращенно блокировка X, как следует из названия, не может сосуществовать с другими блокировками. Например, если транзакция получает монопольную блокировку строки данных, другие транзакции не могут устанавливать другие блокировки строки. , включая разделяемые блокировки и монопольные блокировки, блокировка, но транзакция, которая получает монопольную блокировку, может читать и изменять данные.

1.2 Тематическое исследование

Пример сценария использования: Возьмем MySQL InnoDB в качестве примера.

В качестве демонстрации мы продолжаем использовать предыдущую таблицу базы данных: таблица продуктов

productId productName productPrice productCount
1 Просо 1999 100
2 Мейзу 1999 100

Сначала нам нужноset autocommit=0, т.е. автофиксация не разрешена

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

вопрос

Проблемы, вызывающие согласованность данных в параллельных ситуациях: Если есть два пользователя, A и B, которые хотят получить мобильный телефон Xiaomi с productId = 1, пользователи A и B оба проверяют, что количество мобильных телефонов Xiaomi равно 100, количество модифицированных продуктов после покупки пользователем A равно 99. , а количество модифицированных продуктов после покупки B равно 99.

Применение

Каждый раз, когда вы получаете телефон Xiaomi, добавляйте к продукту эксклюзивную блокировку. То есть, когда пользователь А получает информацию о мобильном телефоне Xiaomi с id=1, запись строки блокируется, в течение которой другие пользователи блокируются и ждут доступа к записи. код показывает, как показано ниже:

start transaction;
 
select p.productCount from product p where p.productId = 1 for update;
 
update product p set p.productCount=p.productCount-1 where p.productId=1 ;
 
commit;

действовать

Следующее открывает два окна одновременно, чтобы имитировать 2 пользователей, одновременно обращающихся к базе данных.

Лента новостей Транзакция А Транзакция Б
T1 start transaction;
T2 select p.productCount from product p where p.productId = 1 for update;
T3 start transaction;
T4 выберите p.productCount из продукта p, где p.productId = 1 для обновления (ожидание...)

Описание потока

  1. Пользователь Стартовая транзакция запускает транзакцию. На предыдущем шаге мы отключили автофиксацию mysql, поэтому нам нужно вручную контролировать фиксацию транзакции.
  2. Когда информация о мобильном телефоне Xiaomi (productId = 1) получена, выполняется операция блокировки данных (для обновления). В отличие от обычного метода запроса, мы используемselect…for updateТаким образом, через базу данных реализуется пессимистическая блокировка. Другие посторонние лица не могут изменить эти данные до фиксации транзакции обновления, но этот метод обработки неэффективен и, как правило, не рекомендуется.
  3. Пользователь B начинает транзакцию запускает транзакцию.
  4. Пользователь B также выполняет операцию запроса и ожидает (заблокирован). ps: он будет выполнен только после того, как транзакция пользователя A будет совершена.

Примечание: В транзакции, только когда выбор... для обновления (монопольная блокировка) или блокировка в режиме общего доступа (общая блокировка) оперирует одними и теми же данными, он будет ждать завершения других транзакций, прежде чем выполнять его.Как правило, выберите... на это не влияет. Например, если вы выполните select p.productCount из продукта p, где p.productId = 1 в T3, данные можно запросить обычным образом, и первая транзакция не повлияет на них.

2. Оптимистичный замок

2.1 Определения

Энциклопедия Байду:

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

Другие точки знаний

Обычно существует два способа реализации оптимистической блокировки:

  • Использовать номер версии Он реализован с использованием механизма записи версии данных (Version), который является наиболее часто используемой реализацией оптимистической блокировки. Что такое версия данных? То есть добавление идентификатора версии к данным, обычно путем добавления числового поля «версия» в таблицу базы данных. При чтении данных вместе считывайте значение поля версии и добавляйте единицу к значению версии каждый раз при обновлении данных. Когда мы отправляем обновление, сравниваем информацию о текущей версии соответствующей записи в таблице базы данных со значением версии, извлеченным в первый раз.Если номер текущей версии таблицы базы данных равен значению версии, извлеченному для первого время, они будут обновлены, в противном случае они считаются просроченными данными.

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

2.2 Тематическое исследование

Пример сценария использования: Возьмем MySQL InnoDB в качестве примера.

В качестве демонстрации мы продолжаем использовать предыдущую таблицу базы данных: таблица продуктов

productId productName productPrice productCount version
1 Просо 1999 100 1
2 Мейзу 1999 100 2

мы начинаем с版本号Как это реализовать будет объяснено.

действовать

Запросить текущий уровень изоляции транзакций:


SELECT @@tx_isolation;


结果:
REPEATABLE-READ

Следующее открывает два окна одновременно, чтобы имитировать 2 пользователей, одновременно обращающихся к базе данных.

первый тест

Лента новостей Пользователь А Пользователь Б
T1 start transaction;
T2 select * from product p where p.productId = 1;(productCount=100)
T3 обновить продукт p установить p.productCount = 99, версия = версия + 1, где p.productId = 1 и версия = 1; (затронутые строки: 1)
T4 start transaction;
T5 select * from product p where p.productId = 1;(productCount=100)
T6 обновить продукт p установить p.productCount = 99, версия = версия + 1, где p.productId = 1 и версия = 1; (ожидание...)
T7 commit;
T8 T6 выполняется (затронутые строки: 0)
T9 commit;

Описание потока

  1. Транзакция A начинает транзакцию.
  2. Транзакция A запрашивает, что текущее количество телефонов Xiaomi равно 100.
  3. Транзакция A покупает телефон Xiaomi, и количество телефонов Xiaomi обновляется до 99. (Транзакция не совершена в это время).
  4. Транзакция B начинает транзакцию.
  5. Транзакция B запрашивает, что текущее количество телефонов Xiaomi равно 100.
  6. Транзакция B покупает телефон Xiaomi, и количество телефонов Xiaomi обновляется до 99. Примечание. В настоящее время он заблокирован.
  7. Транзакция A фиксирует транзакцию.
  8. В этот момент выполняется шестой шаг, но безуспешно (затронутые строки: 0).
  9. Транзакция B фиксирует транзакцию.

второй тест

Лента новостей Пользователь А Пользователь Б
T1 select * from product p where p.productId = 1;(productCount=100)
T2 обновить продукт p установить p.productCount = 99, версия = версия + 1, где p.productId = 1 и версия = 1; (затронутые строки: 1)
T3 select * from product p where p.productId = 1;(productCount=100)
T4 обновить продукт p установить p.productCount = 99, версия = версия + 1, где p.productId = 1 и версия = 1; (затронутые строки: 0)

Резюме оптимистичной блокировки

  • Когда пользователь B изменяет данные, количество затронутых строк равно 0. Для бизнеса обновление завершается ошибкой. На данный момент нам нужно только сообщить пользователю, что покупка не удалась, и проверить его еще раз.
  • Сравнивая первый и второй тесты, мы обнаружим, что первый тест блокирует оператор обновления в транзакции, а второй тест не блокирует. Почему это? На самом деле не имеет значения, происходит ли обновление в транзакции или нет. Внутренне обновление является однопоточным, и если поток выполняет операцию обновления фрагмента данных, он получит блокировку. Если другие потоки захотят работать с одними и теми же данными, он будет блокироваться до тех пор, пока это не освободит блокировку после успешного обновления потока.

Оптимистическая блокировка не требует поддержки базовой базы данных!

3. Применимые сценарии

пессимистический замок

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

оптимистическая блокировка

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

конец статьи

В этой главе кратко представлена ​​база данных乐观锁与悲观锁В будущем мы продолжим вводить другие блокировки и связанные с ними знания в базу данных. такие как блокировки строк, блокировки таблиц, взаимоблокировки,

Добро пожаловать в публичный аккаунт:Программирование кодераПолучайте последние оригинальные технические статьи и соответствующие бесплатные учебные материалы и изучайте технические знания в любое время и в любом месте!

Справочная статья:

Чэньчжоу 123520.ITeye.com/blog/186095…

Чэньчжоу 123520.ITeye.com/blog/186340…

微信公众号

Рекомендуемое чтение

Познакомить вас с использованием JOIN в базе данных.

Позвольте вам понять характеристики ACID транзакций в базе данных.

5 минут, чтобы понять изоляцию транзакций и уровень изоляции