Поведение MySQL READ_COMMITTED при увеличении значения

#mysql #transactions

Вопрос:

Если я выполню следующую инструкцию дважды параллельно в транзакции MySQL с READ_COMMITTED, какой результат я получу?

 UPDATE some_table set count = count   1 where id = x;
 

Предполагая, что количество до выполнения равно 1 , какую из этих стратегий MySQL использует внутренне при увеличении значения строки?

Один с расовым состоянием:

Время Поток MySQL A Поток MySQL B
1 Выберите текущий count из таблицы (1) Выберите текущий count из таблицы (1)
2 Увеличение count объема памяти (2) Увеличение count объема памяти (2)
3 Блокировка строки, количество обновлений = 2 — Заблокирован —
4 — Готово — Блокировка строки, количество обновлений = 2

Один без условий гонки:

Время Писатель А Писатель Б
1 Блокировка строк — Заблокирован —
2 Выберите текущий count из таблицы (1) — Заблокирован —
3 Увеличение count объема памяти (2) — Заблокирован —
4 количество обновлений = 2 — Заблокирован —
5 — Готово — Выберите текущий count из таблицы (2)
6 — Готово — Увеличение count объема памяти (3)
7 — Готово — количество обновлений = 3

Какие гарантии READ_COMMITTED дает изоляция MySQL в этом случае?

Ответ №1:

Если вы настроены на сохранение номера, используйте

 UPDATE CATEGORY
SET count = count   1
WHERE category_id = x
 

Но я чувствую, что будет более эффективно, если вы сделаете это:

 SELECT c.category_name,
COUNT(p.post_id) AS num_posts
FROM CATEGORY c
LEFT JOIN POSTS p ON p.category_id = c.category_id
 

отражающие совокупные значения базы данных.

Комментарии:

1. Спасибо, но примеры в вопросе предназначены для представления того, что происходит внутри MySQL, когда он выполняет инструкцию update UPDATE some_table set count = count 1 where id = x; . Я обновил вопрос, чтобы быть более ясным