На этой странице написано:
Начало транзакции приводит к фиксации любой ожидающей транзакции.
Итак, по сути, начинаем транзакцию действует как замок. Но затем на этой странице написано:
Если вы запрашиваете данные, а затем вставляете или обновляете связанные данные в рамках одной транзакции, обычный оператор SELECT не обеспечивает достаточной защиты. Другие транзакции могут обновлять или удалять те же строки, которые вы только что запросили.
Эти утверждения кажутся мне противоречивыми, и как мне их согласовать? Для примера предположим, что я реализую кнопку «Мне нравится». Есть таблица со следующими столбцами (user, post, is_liked)
и другая таблица, в которой хранится (post, total_likes)
. Таким образом, чтобы обработать подобный запрос, я бы хотел:
- Считать значение
is_liked
, которое является логическим значением, учитывая user
и post
. - Затем переключить
is_liked
и обновлять как count
Все это нужно делать атомарно. Согласно первой ссылке, мне не нужно блокировать во время чтения, поскольку начало транзакции приводит к фиксации любой ожидающей транзакции. И если какая-то другая транзакция попытается обновить строки одновременно, она будет заблокирована моей ожидающей транзакцией. Но вторая ссылка говорит об обратном. Итак, кто прав и почему?
Вопрос 2: Если мне нужно заблокировать (что я подозреваю, что я делаю), я использую LOCK IN SHARE MODE
или FOR UPDATE
?