Какой уровень изоляции использовать?
Не могу понять как правильно работать с транзакциями и блокировками в postgres.
Идея параллельного доступа мне понятна в разрезе ЯПов (мьютексы, семафоры и т.п.). Но с транзакциями всё иначе, раньше я думал, что просто используя FOR UPDATE (pessimistic_lock) я обойду ошибку конкурентного доступа (изменения и вставки), но ошибки не исчезли =).
Я не могу найти внятных примеров использования того или иного уровня изоляции транзакций для операций вставки\изменений. Можете подсказать, как было бы правильнее использовать транзакции?
К примеру у нас есть три таблицы:
Пользователь ( id | money )
Книга ( id | buy_count | cost | user_id )
История покупок ( id | book_id | user_id (Покупатель) | commission )
Как было бы правильнее организовать следующие юзкейсы (уровень изоляции, тип блокировок):
Добавление книги:
-
- С автора (юзера) списывается 100 монет
-
- Книга добавляется в таблицу книг
Покупка книги:
-
- С пользователя списываются монеты, указанная в стоимости
-
- Зачисляется на счет автора 50%
-
- Увеличить поле "buy_count" на 1.
-
- В таблицу истории покупок добавляется запись о покупке.
Получение кол-ва продаж всех книг (тут скорее вопрос не про транзакции, а про производительность, т.е. до какого лимита по кол-ву записей можно на каждый запрос юзера проходиться по всей таблице и считать)
Эти юзкейсы скорее не просто про SQL запросы, но также и про то, как лучше обработать ошибки параллельного доступа (если от них невозможно избавиться).