Sobes.tech
Middle

Кои нива на изолация на транзакции в базите данни познаваш?

sobes.tech AI

Отговор от AI

Стандартът SQL дефинира четири нива на изолация на транзакциите: Read Uncommitted, Read Committed, Repeatable Read, Serializable.

  1. Read Uncommitted: Най-ниското ниво. Транзакция може да чете данни, които все още не са потвърдени (т.е. извършени от друга транзакция, която все още не е завършила с COMMIT). Това води до "мръсни" четения (dirty reads).

  2. Read Committed: Транзакцията вижда само данните, които са били потвърдени преди или по време на изпълнението ѝ. Предотвратява "мръсните" четения, но позволява неповторими четения (non-repeatable reads) и фантоми (phantom reads).

    • Неповторими четения: Същото четене в рамките на една транзакция може да върне различни данни, защото друга транзакция ги е променяла и потвърдила.
    • Фантоми: При изпълнение на заявка с условие WHERE, втора транзакция добавя или премахва редове, които отговарят на условието, и повторното изпълнение на същата заявка в рамките на първата транзакция връща друг набор от редове.
  3. Repeatable Read: Транзакцията вижда само данните, които са били потвърдени преди началото ѝ. Гарантира, че повторните четения на едни и същи редове в рамките на една транзакция ще върнат еднакви данни. Предотвратява "мръсни" и неповторими четения. Позволява фантоми.

    // Пример за Repeatable Read
    // Транзакция 1
    // BEGIN TRANSACTION;
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Например, 100
    
    // Транзакция 2 (изпълнява се едновременно)
    // BEGIN TRANSACTION;
    // INSERT INTO users (name, status) VALUES ('Нов потребител', 'active');
    // COMMIT;
    
    // Транзакция 1
    // SELECT COUNT(*) FROM users WHERE status = 'active'; // Все още 100 (фантом)
    // COMMIT;
    
  4. Serializable: Най-високото ниво на изолация. Гарантира, че паралелното изпълнение на транзакции ще бъде еквивалентно на някакво последователно изпълнение на тези транзакции. Предотвратява "мръсни" четения, неповторими четения и фантоми. Може да доведе до намаляване на производителността поради блокировки.

В различните системи за управление на бази данни (СУБД) могат да съществуват свои реализации и особености на нивата на изолация, както и допълнителни нива. Например, в MySQL InnoDB по подразбиране е Repeatable Read.