aspcartman
@aspcartman
Software Engineer since 2010

Можно ли не блокировать строки в InnoDB при выборочном update?

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

Имеется к примеру следующая таблица.
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `score` int(11) DEFAULT NULL,
  `rating` int(10) unsigned DEFAULT NULL,
  ... ,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=... DEFAULT CHARSET=utf8;


Задача:
Существует модуль статистики, работающий по следующему алгоритму:
1) Достать все записи `Users`, отсортировать по `score`
2) Для каждого юзера записать в `rating` позицию в таблице, полученной в п.1
2.a) В отдельной транзакции
2.б) В одной транзакции, обновив всех оптом.

Из условия следует, что транзакции будут читать одно поле и обновлять другое поле. Однако существуют другие транзакции, выполняющие самые различные операции над таблицой `Users` и другими таблицами. Эти операции по условию требуют блокировок. Так же эти транзакции могут обновлять `score`, но `rating` используют только для чтения. Для работы рассматриваемого модуля слежение за актуальностью в `score` между 1) и 2) не требуется - какое значение на момент 1) было прочитано, с таким и требуется работать, даже если оно позже обновилось.

Проблема текущего решения:
В текущем решении блокировки осуществляются в режиме, заданном по умолчанию для реализации MariaDB/XtraDB, коий, на сколько мне известно, соответствует онному в mysql. Транзакций огромное количество и случаются дедлоки. Дедлоки встречаются только в случае, если активен модуль статистики. Если модуль статистики исключить, система прекрасно функционирует и судя по InnoTOP ожиданий практически не происходит.

Вопросы:
1) Безопасно ли отключить для транзакций модуля статистики построчную блокировку, не нарушая целостность данных? Атомарности, из условия, ведь не требуется, никто не попытается записать в ту же колонку что-то другое, однако возможно попытается прочитать.
2) Если на (1) ответ положителен, то как?
3) Обобщение: можно ли отключить построчную блокировку всех транзакций, если по условию гарантируется, что ни одна транзакция не попытается сделать одновременно `update` для того же поля той же строки в той же таблице, что и другая. Колонки под вопросом не индексируются.
4) Крайне вероятен вариант, что мой алгоритм - бред сумасшедшего, а значит я буду благодарен за любые советы по вопросу реализации описанного модуля. (Нужно просто как-то, не обязательно в реальном времени, но при этом не вешая базу, обновлять рейтинг у пользователей. ).

Благодарю за советы новичку!
  • Вопрос задан
  • 290 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы