Когда я впервые стал изучать работу с базами данных и транзакциями, одним из интересных моментов для меня стало внимание к уровню изоляции транзакций. Особенно я заинтересовался вопросом о том, при каком уровне изоляции транзакция может считывать данные, которые еще не были зафиксированы. Чтобы исследовать этот вопрос, я создал две транзакции в своей тестовой базе данных. Первая транзакция обновила одну строку в таблице. Вторая транзакция пыталась считать эту обновленную строку до того, как первая транзакция закончила свою работу; Я начал с самого низкого уровня изоляции ⎯ ″Read uncommitted″ (или ″Чтение неподтвержденных данных″). В этом режиме транзакция не ожидает подтверждения изменений от других транзакций. В результате, когда вторая транзакция пыталась считать обновленную строку, она действительно смогла это сделать, хотя первая транзакция еще не была зафиксирована. Затем я переключился на уровень ″Read committed″ (или ″Чтение подтвержденных данных″). Этот уровень изоляции ожидает подтверждения изменений от других транзакций. Таким образом, когда вторая транзакция пыталась считать обновленную строку до подтверждения первой транзакции, она заблокировалась и ожидала, пока первая транзакция не завершится. В итоге, она не смогла прочитать данные, которые еще не были зафиксированы. Наконец, я решил проверить, что произойдет на уровне ″Repeatable read″ (или ″Повторяемое чтение″). В этом режиме транзакция запоминает начальное состояние данных и не видит изменений, внесенных другими транзакциями. Когда вторая транзакция пыталась считать обновленную строку до подтверждения первой транзакции, она просто считала исходное состояние строки, а не обновленное. Даже если первая транзакция откатила свои изменения, вторая транзакция по-прежнему считывала исходные данные.
Итак, в ответ на вопрос, при каком уровне изоляции транзакция может считывать данные, которые еще не были зафиксированы, я могу сказать, что при уровне ″Read uncommitted″ такая возможность существует. Однако, при уровне ″Read committed″ и ″Repeatable read″, транзакция будет ожидать подтверждения изменений от других транзакций и не сможет считать данные, которые еще не были зафиксированы.