#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;
. Я обновил вопрос, чтобы быть более ясным