Что произойдет, если записи будут удалены в процессе извлечения данных? - PullRequest
0 голосов
/ 13 июля 2009

Допустим, у меня есть 6 записей, и я установил размер выборки равным 2.

[Id] [Name]
 11   A   <-- 1st fetch, start from 1 position
 21   B
 31   C   <-- 2nd fetch, start from 3 position
 41   D
 51   E   <-- 3rd fetch, start from 5 position
 61   F

Если 1-й пользователь выдает «SELECT * from tablex», а 2-й пользователь выдает «DELETE FROM tablex, ГДЕ Id = 2. Процесс удаления происходит как раз во время между 1-й и 2-й выборками.

Первая выборка (A)

[Id] [Name]
 11   A   <-- 1st fetch, start from 1
 21   B

После удаления из (B)

[Id] [Name]
 11   A   <-- 1st fetch, start from 1
 31   C   
 41   D
 51   E   
 61   F

Теперь 2-й выбор для (A) должен начинаться с 3, но удаление приводит к изменению положения записей. Если 2-й выбор начинается с позиции 3, записи, которые будут выбраны:

[Id] [Name]
 41   D   <-- position 3
 51   E   

вместо

[Id] [Name]
 31   C   <-- 2nd fetch, start from 3 position
 41   D

Я не уверен, возникнет ли эта проблема или нет. Или современный БД достаточно умен, чтобы его обнаружить? Или просто заблокировать таблицу в процессе извлечения данных?

Ответы [ 3 ]

2 голосов
/ 13 июля 2009

То, что вы спрашиваете, называется " PHANTOM READ ". Большинство баз данных используют блокировки, чтобы предотвратить это в транзакции.

Некоторые базы данных обеспечивают уровень изоляции READ COMMITTED (или ниже), в таких случаях может происходить фантомное чтение

1 голос
/ 13 июля 2009

В MSSQL такой проблемы быть не может, поскольку блокировка активирована, а набор результатов восстановлен. Я не знаю, что насчет другой РСУБД.

0 голосов
/ 13 июля 2009

Что произойдет, будет зависеть отчасти от уровней изоляции, действующих в двух транзакциях.

Если процесс извлечения выполняется с сериализуемой изоляцией, операция DELETE завершится неудачей. Если процесс извлечения выполняется с изолированным чтением (чтение не передано), то почти все возможно, но, скорее всего, он будет читать записи, которые не удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...