Кои нива на изолация на транзакции в базите данни познаваш?
sobes.tech AI
Отговор от AI
Стандартът SQL дефинира четири нива на изолация на транзакциите: Read Uncommitted, Read Committed, Repeatable Read, Serializable.
-
Read Uncommitted: Най-ниското ниво. Транзакция може да чете данни, които все още не са потвърдени (т.е. извършени от друга транзакция, която все още не е завършила с
COMMIT). Това води до "мръсни" четения (dirty reads). -
Read Committed: Транзакцията вижда само данните, които са били потвърдени преди или по време на изпълнението ѝ. Предотвратява "мръсните" четения, но позволява неповторими четения (non-repeatable reads) и фантоми (phantom reads).
- Неповторими четения: Същото четене в рамките на една транзакция може да върне различни данни, защото друга транзакция ги е променяла и потвърдила.
- Фантоми: При изпълнение на заявка с условие
WHERE, втора транзакция добавя или премахва редове, които отговарят на условието, и повторното изпълнение на същата заявка в рамките на първата транзакция връща друг набор от редове.
-
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; -
Serializable: Най-високото ниво на изолация. Гарантира, че паралелното изпълнение на транзакции ще бъде еквивалентно на някакво последователно изпълнение на тези транзакции. Предотвратява "мръсни" четения, неповторими четения и фантоми. Може да доведе до намаляване на производителността поради блокировки.
В различните системи за управление на бази данни (СУБД) могат да съществуват свои реализации и особености на нивата на изолация, както и допълнителни нива. Например, в MySQL InnoDB по подразбиране е Repeatable Read.