Транзакция базы данных считана незафиксированной - PullRequest
0 голосов
/ 23 января 2020

У меня есть один вопрос о транзакциях. Надеюсь, это не дубликат, я долго искал и ничего полезного не нашел. Итак, я недавно узнал о database transactions и read uncommitted.

Может ли транзакция (или простой запрос) считывать грязные данные из инструкции DML, которая все еще выполняется?

Например, у меня есть таблица R (A) с кортежами ({1}, {2}) и двумя транзакциями:

T1: UPDATE R SET A=A*2;
T2: SELECT AVG(R) FROM R;

Мы предполагаем, что T2 ISOLATION LEVEL равно READ UNCOMMITTED.

Есть ли вероятность, что T2 будет считывать грязные данные из T1, даже если это еще не конец? Например, T1 обновляется в момент исполнения T2 только первым tuple (R становится сейчас ({2}, {2} или ({1} , {4}))?

Как транзакция выполняется в подобных ситуациях?

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Я нашел ответ на свой вопрос. Я думал, что при чтении незафиксированными мои операторы могут мешать друг другу во время выполнения одного оператора (например, значение A обновляется только в первом кортеже, выполняется T2 и после этого обновляется второй кортеж), и я обнаружил, что чтение без подтверждения допускает вмешательство после выполнения оператора (не всех операторов из транзакции).

0 голосов
/ 23 января 2020

Если вы используете MS SQL, то вы можете использовать NOLOCK:

SELECT AVG(A) FROM R (NOLOCK);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...