乐观锁и悲观锁Он в основном используется для решения проблем параллелизма, и это относительно низкоуровневая проблема параллелизма.
Сцены
Как правило, когда несколько пользователей обрабатывают один и тот же ресурс, возникают проблемы параллелизма. Например, пользователю понравилась статья. Наша бизнес-обработка обычно выглядит следующим образом:
| шаг | действовать | пример заявления базы данных |
|---|---|---|
| 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 | завершить транзакцию |
Суммировать
В этой статье кратко представлен уровень базы данных
乐观锁и悲观锁концепция, но в процессе разработки существует много типов замков, таких как偏向锁,轻量级锁,重量级锁,间隙锁Подождите, для разных проблем параллелизма решения на самом деле разные, но все же есть некоторый опыт, накопленный гигантами для справки.
- Пессимистичные блокировки подходят для сценариев с большим количеством операций записи и меньшим количеством операций чтения;
- Оптимистическая блокировка подходит для сценариев, где нужно меньше писать и больше читать;
- Предложение Alibaba: если вероятность каждого конфликта доступа меньше
20%,Рекомендуемое использование乐观锁, иначе используйте悲观锁.乐观锁Количество попыток должно быть не менее3второсортный; - Управляйте областью блокировок и уменьшайте область действия заблокированных объектов, например, используя блокировки строк.