Да, оператор является атомарным, но да, данные могут меняться между двумя чтениями.
Read Committed
только гарантирует, что вы не читаете грязные данные, он ничего не обещает о согласованности операций чтения, для которых вам потребуется более высокий уровень изоляции.
Как вы сказали, вы примете пример SQL Server ...
Соединение 1
(Предполагается, что уровень изоляции зафиксирован при пессимистическом чтении)
CREATE TABLE employee
(
name VARCHAR(50),
DepartmentID INT
)
CREATE TABLE department
(
DepartmentID INT
)
INSERT INTO department VALUES (1)
INSERT INTO employee VALUES ('bob',1)
declare @employee TABLE
(
name VARCHAR(50),
DepartmentID INT
)
WHILE ((SELECT COUNT(*) FROM @employee) < 2)
BEGIN
DELETE FROM @employee
INSERT INTO @employee
SELECT employee.*
FROM employee
LEFT JOIN department
ON employee.DepartmentID = department.DepartmentID
UNION
SELECT employee.*
FROM employee
RIGHT JOIN department
ON employee.DepartmentID = department.DepartmentID
END;
SELECT * FROM @employee
Соединение 2
while (1=1)
UPDATE employee SET name = CASE WHEN name = 'bob' THEN 'bill' else 'bob' END
Теперь вернитесь к соединению 1
name DepartmentID
-------------------------------------------------- ------------
bill 1
bob 1
(Не забудьте переключиться обратно на Соединение 2, чтобы убить его!)
Специальная документация, охватывающая это READ COMMITED
поведение здесь
Тип общей блокировки определяет, когда
это будет выпущено. Рядные замки
выпущен до следующего ряда
обработанный. Блокировки страниц снимаются
когда следующая страница прочитана, и таблица
блокировки снимаются при утверждении
отделка.