#mysql #sql #sql-server #post
#MySQL #sql #sql-сервер #Публикация
Вопрос:
Я не понимаю, почему он вызывается как фантомный запрос .. например, предположим, что эти 3 запроса:-
Запрос 1
SELECT * FROM users
WHERE salary BETWEEN 10000 AND 300000;
возвращает 2 записи.
Запрос 2
INSERT INTO users VALUES ( 3, 'Bob', 270000 );
COMMIT;
Снова запрос 1
SELECT * FROM users
WHERE salary BETWEEN 10000 AND 30000;
возвращает 3 записи.
Видите ли, мне это кажется нормальным. Я не понимаю, почему они называются «фантомным чтением». все транзакции происходят в разное время, поэтому мы всегда получаем самые последние данные. изначально было 2 записи, позже была вставлена 1 запись .. поэтому, когда мы запускаем запрос еще раз, мы получаем обновленные данные, то есть 3 записи. Итак, почему это называется фантомным запросом.?
Комментарии:
1. Если они происходят в 3 отдельных транзакциях, то это не фантом. Проблема с фантомом возникает, когда одна и та же транзакция выполняет запрос диапазона более одного раза, и между 2 запросами вставляется фантомная строка.
Ответ №1:
На чисто академическом уровне транзакция должна видеть согласованное состояние базы данных на основе данных, когда транзакция началась. Он должен видеть только свои собственные изменения и ничего больше.
Пока транзакция 1 не завершила просмотр зафиксированных данных, считается фантомным чтением, потому что она видит строки, которых не было при запуске транзакции.
Поскольку этот строгий академический подход не всегда необходим, были введены разные уровни изоляции. В зависимости от требований разработчик может выбрать, какой уровень необходим, на основе реализуемых бизнес-правил.
Иногда вам нужны фантомные чтения, тогда вы используете READ COMMITTED
уровень изоляции (который используется по умолчанию для большинства СУБД), иногда они вам не нужны — тогда вы используете SERIALIZABLE
уровень изоляции
Комментарии:
1. Вам
SERIALIZABLE
неREPEATABLE READ
нужно предотвращать фантомы.2. Вы правы. Я путал неповторяемые чтения и фантомные чтения.
Ответ №2:
Фантомные чтения происходят, если для транзакции неправильно установлены блокировки диапазона. Здесь произойдет именно то, что вы написали — первый select вернет 2 строки, а второй select вернет 3 строки.
Фантомное чтение по определению означает, что выполняются два идентичных запроса, а набор строк, возвращаемых вторым запросом, отличается от первого. Если была применена правильная изоляция, оба раза должен быть возвращен один и тот же набор строк.