Что такое уровень изоляции транзакций Read Committed?

Ответ

Read Committed — уровень изоляции транзакций, который гарантирует, что транзакция видит только зафиксированные данные других транзакций.

Гарантии:Защита от "грязного" чтения (Dirty Read) — нельзя прочитать незафиксированные изменения ❌ Нет защиты от неповторяемого чтения (Non-repeatable Read) ❌ Нет защиты от фантомного чтения (Phantom Read)

Пример проблемы с неповторяемым чтением:

-- Транзакция 1
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT balance FROM accounts WHERE id = 1; -- Возвращает 100

-- Транзакция 2 (параллельно)
UPDATE accounts SET balance = 200 WHERE id = 1;
COMMIT;

-- Транзакция 1 (продолжение)
SELECT balance FROM accounts WHERE id = 1; -- Теперь возвращает 200!
COMMIT;

Особенности в разных СУБД:

  • PostgreSQL: уровень по умолчанию, использует MVCC
  • Oracle: уровень по умолчанию, использует откаты (undo segments)
  • SQL Server: требует блокировок для предотвращения грязного чтения

Установка в JDBC:

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Когда использовать:

  • Большинство OLTP-приложений
  • Когда допустимы незначительные расхождения в данных
  • Для баланса между согласованностью и производительностью

Ответ 18+ 🔞

А, ну вот, слушай, смотри, сейчас я тебе про Read Committed так расскажу, что ты, блядь, офигеешь. Это ж самый, сука, распространённый уровень изоляции, как хлеб с маслом, его везде суют по умолчанию, и не просто так!

Представь себе: сидит транзакция, читает себе данные. И тут, блядь, главный принцип — она видит только то, что уже закоммитили другие. То есть, пока какой-то чувак там UPDATE'ит строку и не нажал COMMIT — ты эту ебучую правку не увидишь. Защита от грязного чтения, ёпта! Это как не видеть, пока сосед по комнате не вынес ведро — пока не вынес, вонь есть, но ты её не чувствуешь, красота.

Но вот в чём, сука, подвох, и он жирный! Защищает он только от этой вони, а от остального — нихуя. Нет тут никакой защиты от «неповторяемого чтения» и «фантомов». Сейчас на пальцах, блядь.

Вот смотри, код, не трогаю его, он святой:

-- Транзакция 1
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT balance FROM accounts WHERE id = 1; -- Возвращает 100

-- Транзакция 2 (параллельно)
UPDATE accounts SET balance = 200 WHERE id = 1;
COMMIT;

-- Транзакция 1 (продолжение)
SELECT balance FROM accounts WHERE id = 1; -- Теперь возвращает 200!
COMMIT;

Видишь, в чём пиздец? Первый раз прочитал — 100. Пока он там думал, второй чувак пришёл, бабки спиздил, то есть, обновил баланс на 200 и зафиксировал. Первый чувак снова читает — а у него уже 200! Он, блядь, в рамках одной своей же транзакции два разных значения получил! Это и есть «неповторяемое чтение», ёбаный насос. Данные под ногами разъехались.

А про «фантомы» я молчу — это когда строки новые из ниоткуда возникают или старые в никуда пропадают, пока твоя транзакция жива. Read Committed на это тоже плевать хотел, смотрит в книгу — видит фигу.

А теперь, сука, самое интересное — как они это реализуют! Тут, блядь, разброд и шатание.

  • PostgreSQL — умница, у него там MVCC, версионность. Он тебе просто старую версию строки из снапшота подсовывает, пока другая транзакция не закоммитилась. Красота, блокировок на чтение нет вообще.
  • Oracle — тоже красавчик, по умолчанию тот же Read Committed, но через свои «сегменты отката» работает. Хуй пойми как, но работает.
  • SQL Server — а вот этот, сука, любитель блокировок. Чтобы тебе грязное чтение не подсунули, он будет ставить блокировки на строки, которые ты читаешь. Может и до дедлока доиграться, если неаккуратно.

Воткнуть это в JDBC — проще пареной репы, один хуй не разберёшься:

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Так когда же его использовать-то, блядь? Да в 90% случаев! Серьёзно. Для всяких OLTP-приложений, где перфоманс важен, а мелкие расхождения в данных (типа, прочитал 100, а через полсекунды уже 200) — не конец света. Идеальный баланс, ёпта, между «всё чётко» и «летает быстро». Если, конечно, тебе не нужно, чтобы данные были стабильны, как скала, на протяжении всей транзакции — тогда вали, блядь, на уровень выше, на Repeatable Read, и не морочь голову.