Две параллельные транзакции на уровне изоляции SERIALIZABLE

Рассмотрим две параллельные транзакции SQL:

X = 0 
T1:                    |  T2: 
begin                  | begin
set serializable level | set serializable level
                       |  
WRITE(X,1)
                       | READ(X) : 0
COMMIT                 |  
                       | COMMIT

Я тестировал его с PosgreSQL. Почему T2 фиксирует правильно? Обе транзакции имеют сериализуемый уровень. Итак, на мой взгляд, послеT2 была запущена строка X изменена. Итак, T2:COMMIT должен потерпеть неудачу. Почему это не так?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

In effect, a SELECT query sees a snapshot of the database as of the instant the query begins to run. Source

Запрос SELECT будет работать только с этим моментальным снимком. Но другие виды запросов ведут себя так, как вы ожидаете.

UPDATE, DELETE, SELECT FOR UPDATE, and SELECT FOR SHARE . . . will wait for the first updating transaction to commit or roll back (if it is still in progress). Source (ibid)

Вы можете проверить это поведение, например, запустив два сеанса psql. Запустите оператор UPDATE в одном сеансе и SELECT...FOR UPDATE в другом.


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

Другие вопросы по теме