Будучи совершенно зеленым неофитом в области баз данных, мне интересно, безопасно ли отключить блокировки в базе в следующей ситуации.
Имеется к примеру следующая таблица.
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) Крайне вероятен вариант, что мой алгоритм - бред сумасшедшего, а значит я буду благодарен за любые советы по вопросу реализации описанного модуля. (Нужно просто как-то, не обязательно в реальном времени, но при этом не вешая базу, обновлять рейтинг у пользователей. ).
Благодарю за советы новичку!