Неатомарное значение SELECT специфично для SQL Server или возможно в других СУБД? - PullRequest
1 голос

Мой ответ на мой вопрос Предотвращено ли чтение наполовину записанных значений, когда подсказка SELECT WITH (NOLOCK)? цитирует скрипт, иллюстрирующий перехват неатомарных операций чтения (SELECTs) частичнообновленные значения в SQL Server.

Является ли такая неатомарная (частично обновленная, вставленная, удаленная) проблема чтения значений специфичной для SQL Server?
Возможно ли это в других СУБД?

Обновление:
Не так давно я считал, что уровень изоляции транзакции READ UNCOMMITTED (также достигаемый с помощью подсказки WITH (NOLOCK) в SQL Server) позволяет читать (из других транзакций) незафиксированные (или зафиксированные, еслиеще не изменены) значения, но не частично изменены (частично обновлены, частично вставлены, частично удалены).

Обновление 2:
Первые два ответа отклонили обсуждение от атаки на явление READ UNCOMMITTED (уровень изоляции), указанное в спецификациях ANSI / ISO SQL-92.
Этот вопрос не об этом.
Является ли неатомарность значения (не строки!) Совместимой с READ UNCOMMITTED и грязным чтением вообще?

Я считал, что READ UNCOMMITTED подразумевает чтение непереданных строк во всей их полноте, но не частично измененных значениях.

Включает ли определение «грязное чтение» возможность неатомичности изменения значения?

Это ошибка или дизайн?
или по определению ANSI SQL92 «грязное чтение»?Я считал, что «грязное чтение» включает в себя атомарное чтение незафиксированных строк, но не измененные атомом значения ...

Ответы [ 4 ]

1 голос
/ 28 ноября 2010

Существует различие между Atomicity и READ COMMITTED, если реализация последнего основана на блокировке.

Рассмотрим транзакции A и B. Транзакция A представляет собой один SELECT для всех записей со статусом «ожидание» (возможно, полное сканирование очень большой таблицы, поэтому это занимает несколько минут).

At 3:01 transaction A reads record R1 in the database and sees its status is 'New' so doesn't return it or lock it.
At 3:02 transaction B updates record R1 from 'New' to 'Pending' and record R2000 from 'New' to 'Pending' (single statement)
At 3:03 transaction B commits
At 3:04 transaction A reads record R2000, sees it is 'Pending' and committed and returns it (and locks it).

В этой ситуации выбор в транзакции A видел только часть транзакции B, нарушающую атомарность. Технически, хотя, выборка только возвратила подтвержденные записи.

Базы данных, полагающиеся на блокировку чтения, страдают от этой проблемы, потому что единственным решением было бы заблокировать всю читаемую таблицу, чтобы никто не мог обновить какие-либо записи в любой из них. Это сделало бы непрактичным любое параллельное действие.

На практике большинство приложений OLTP имеют очень быстрые транзакции, работающие на очень маленьких объемах данных (по сравнению с размером базы данных), и параллельные операции имеют тенденцию попадать в разные «кусочки» данных, поэтому ситуация возникает очень редко. Даже если это произойдет, это не обязательно приведет к заметной проблеме, и даже если это так, их очень трудно воспроизвести, и для их исправления потребуется совершенно новая архитектура. Короче говоря, несмотря на то, что это теоретическая проблема, на практике о ней часто не стоит беспокоиться.

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

Это одна из причин, по которой SQL Server добавил неблокирующие согласованные операции чтения в 2005 .

1 голос
/ 27 ноября 2010

Возможно ли это в других СУБД?

Насколько мне известно, единственными другими базами данных, которые позволяют READ UNCOMMITTED, являются DB2, Informix и MySQL при использовании нетранзакционного механизма.

1 голос
/ 27 ноября 2010

Весь ад вышел бы на свободу, если бы атомарные операторы были на самом деле не атомарными.
Я могу ответить на этот вопрос для MSSQL - все отдельные операторы являются атомарными, «грязное чтение» относится к возможности чтения «фантомной строки», которая можетне существует после передачи / отката TX.

0 голосов
/ 27 ноября 2010

Теория базы данных требует, чтобы на всех уровнях изоляции отдельные операторы UPDATE или INSERT были атомарными.Их промежуточные результаты не должны быть видны для чтения незафиксированных транзакций.Об этом говорится в документе группы известных экспертов по базам данных.* 1002.тесты из-за сложности определения достоверности возвращаемых наборов результатов.

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