Какой уровень изоляции использовать?

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


Ответы (0 шт):