Читать незафиксированное с обновлением - PullRequest
0 голосов
/ 02 февраля 2020

Рассмотрим таблицу R (A), содержащую {(1), (2)}.

Предположим, транзакции

T1: UPDATE R SET A = 2*A

T2: SELECT AVG(A) FROM R

Если транзакция T2 выполняется с использованием «read uncommitted», какие возможные значения она возвращает?

Я предполагаю, что он может вернуть либо 1,5, 2, 2,5 или 3 из-за незафиксированного чтения и того факта, что порядок кортежей не имеет значения, как я понял из курсов. Я прав?

1 Ответ

0 голосов
/ 02 февраля 2020

Из документации MySQL для READ UNCOMMITTED:

Операторы SELECT выполняются без блокировки, но может использоваться более ранняя версия строки. Таким образом, используя этот уровень изоляции, такие чтения не согласованы. Это также называется грязным чтением. В противном случае этот уровень изоляции работает как READ COMMITTED.

При грязном чтении таблица может просматриваться до, во время или после обновления. Это означает, что, как вы указали, кажущееся среднее значение может составлять 1,5, 2, 2,5 или 3. Рассмотрим:

R1 | R2 | average
1  | 2  | 1.5        <-- update not yet started
2  | 2  | 2          <-- update in progress
1  | 4  | 2.5        <-- update still in progress
2  | 4  | 3          <-- update completed
...