[Daily Fresh Mushroom] Анализ оптимистичных и пессимистичных замков из базы данных

база данных
[Daily Fresh Mushroom] Анализ оптимистичных и пессимистичных замков из базы данных

乐观锁и悲观锁Он в основном используется для решения проблем параллелизма, и это относительно низкоуровневая проблема параллелизма.

Сцены

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

шаг действовать пример заявления базы данных
1 запросить эту статью select id, praise_points from t_article where id = 1
2 будет用户IDи文章IDПодобные отношения записываются в таблицу подобных отношений. insert into t_praise_link (id, user_id, article_id) values (...)
другие темы Обновлено количество лайков к статье ...
3 Обновить лайки статьи update t_article set praise_points = ? where id = 1

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

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

Всегда предполагайте наихудший случай, поэтому каждый раз, когда вы принимаете [select] всегда заблокирован, и другим потокам не разрешено его изменять. в базе данных行锁,表锁,共享锁,排他锁, на ЯвеsynchronizedВсе они относятся к категории пессимистичных блокировок.

Реализация блокировки базы данных

тип замка Пример реализации
общий замок select id, praise_points from t_article where id = 1 lock in share mode
эксклюзивный замок select id, praise_points from t_article where id = 1 for update
эксклюзивный замок Под движком innoDB обновление, вставка, удаление автоматически добавляют эксклюзивные блокировки по умолчанию.

Применить пессимистическую блокировку

Первый анализ должен быть共享锁(允许其它事务也增加共享锁读取,但不允许其它事务修改或者加入排他锁)все еще排他锁, что немаловажно. Прежде всего, давайте посмотрим на бизнес-сценарий в настоящее время. Данные, которые мы блокируем, и данные, которые мы модифицируем, являются таблицами статей. В настоящее время мы используем共享锁Это не подходит, и это склонно к взаимоблокировке.原因是:共享锁,事务都加,都能读。修改是惟一的,必须等待前一个事务commit,才可.

шаг действовать пример заявления базы данных
begin начать транзакцию
1 Запросить эту статью (плюс эксклюзивная блокировка) select id, praise_points from t_article where id = 1 for update
2 будет用户IDи文章IDПодобные отношения записываются в таблицу подобных отношений. insert into t_praise_link (id, user_id, article_id) values (...)
3 Обновить лайки статьи update t_article set praise_points = ? where id = 1
end завершить транзакцию

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

Только когда он будет обновлен, можно будет судить, обновили ли данные другие.

Применить оптимистическую блокировку

обычно используют版本号机制илиCAS算法(潜在ABA问题)выполнить. Наиболее часто используются版本号机制, главным образом потому, что он относительно прост в реализации, обычно используетсяORMЕсть совершенные механизмы реализации.

шаг действовать пример заявления базы данных
begin начать транзакцию
1 Запросить эту статью (плюс эксклюзивная блокировка) select id, praise_points, version from t_article where id = 1
2 будет用户IDи文章IDПодобные отношения записываются в таблицу подобных отношений. insert into t_praise_link (id, user_id, article_id) values (...)
3 Обновить лайки статьи update t_article set praise_points = ? where id = 1 and version = 1
end завершить транзакцию

Суммировать

В этой статье кратко представлен уровень базы данных乐观锁и悲观锁концепция, но в процессе разработки существует много типов замков, таких как偏向锁,轻量级锁,重量级锁,间隙锁Подождите, для разных проблем параллелизма решения на самом деле разные, но все же есть некоторый опыт, накопленный гигантами для справки.

  1. Пессимистичные блокировки подходят для сценариев с большим количеством операций записи и меньшим количеством операций чтения;
  2. Оптимистическая блокировка подходит для сценариев, где нужно меньше писать и больше читать;
  3. Предложение Alibaba: если вероятность каждого конфликта доступа меньше20%,Рекомендуемое использование乐观锁, иначе используйте悲观锁.乐观锁Количество попыток должно быть не менее3второсортный;
  4. Управляйте областью блокировок и уменьшайте область действия заблокированных объектов, например, используя блокировки строк.