Ниже приводится утверждение из статьи об изоляции Википедии о REPEATABLE READS
На этом уровне изоляции реализация СУБД управления параллелизмом на основе блокировок сохраняет блокировки чтения и записи (полученные для выбранных данных) до конца транзакции. Однако блокировки по диапазону не управляются, поэтому может возникнуть феномен фантомного чтения (см. Ниже).
У меня вопрос, когда транзакция начинается и когда заканчивается соответственно.
Если мы возьмем пример неповторяемых чтений с уровнем изоляции REPEATABLE READS по той же ссылке, согласно моему пониманию, транзакция 1 начинается, когда запускается первый запрос, то есть SELECT * FROM users WHERE id = 1.
СУБД будет держать блокировку таблицы пользователей до тех пор, пока транзакция не будет завершена. здесь Под концом, я имею в виду, когда соединение откатывается или фиксируется не после завершения SELECT * FROM users WHERE id = 1
. До этого времени будет ждать Транзакция 2 Верно?
Вопрос 2: - Теперь, если мы рассмотрим уровень изоляции и его поведение, как указано ниже (по той же ссылке)
Isolation level Dirty reads Non-repeatable Phantoms
Read Uncommitted may occur may occur may occur
Read Committed - may occur may occur
Repeatable Read - may occur -
Serializable - - -
Насколько я понимаю, наиболее надежным является Serializable, затем Repeatable Read, а затем Read Committed, но все же я видел приложения, использующие Read Committed. Это из-за производительности Serializable и Repeatable Read плохо по сравнению с Read Committed, потому что в сериализуемом он будет последовательным и в случае транзакции придется ждать освобождения блокировки другой транзакцией. Верно? Итак, чтобы получить лучшее из всех трех, мы можем использовать уровень изоляции как Read Committed с SELECT FOR UPDATE
(для достижения повторяемого чтения). Не уверен, как мы можем добиться фантомного чтения, если захотим, на случай уровня изоляции прочитанного совершенного?
SELECT ... FOR UPDATE
- person Gili   schedule 29.11.2012