Skip to content

Commit

Permalink
PostgreSQL - Serialization Anomaly
Browse files Browse the repository at this point in the history
  • Loading branch information
nobuenhombre committed Jul 13, 2022
1 parent 2d04a28 commit 9afeadc
Show file tree
Hide file tree
Showing 10 changed files with 90 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,93 @@
Это то же самое поведение, что и в MySQL.
Давайте зафиксируем эту транзакцию и поднимемся на 1 уровень вверх.

Повторяемый уровень изоляции чтения в Postgres
----------------------------------------------

Я собираюсь начать 2 новые транзакции, а затем установить
для них уровень изоляции транзакций **repeatable read**.

.. image:: ../../img/postgresql/013-repeatable-read-1.png
:width: 3872
:alt: postgresql - repeatable read part 1

Хорошо, теперь давайте выберем все учетные записи
в transaction 1,
а затем выберем только учетную запись с идентификатором 1
в transaction 2.
Также ищите счета с балансом не менее 80 долларов.

.. image:: ../../img/postgresql/014-repeatable-read-2.png
:width: 3872
:alt: postgresql - repeatable read part 2

Теперь вернитесь transaction 1
и вычтите из его баланса еще 10 долларов.

Баланс был обновлен до 70 долларов в этой транзакции.
Давайте зафиксируем его


.. image:: ../../img/postgresql/015-repeatable-read-3.png
:width: 1944
:alt: postgresql - repeatable read part 3

и посмотрим,
что произойдет в transaction 2.

Теперь, если мы выбираем счет 1 в transaction 2,
он по-прежнему стоит 80 долларов,
хотя transaction 1 и совершил его изменение.

Это потому, что мы используем повторяемый уровень изоляции чтения,
поэтому один и тот же запрос на выборку
всегда должен возвращать один и тот же результат.
**Non-repeatable read** явление не может произойти в этом случае.

Кроме того, если мы повторно запустим запрос
для поиска счетов не менее чем с 80 долларами:

.. image:: ../../img/postgresql/016-repeatable-read-4.png
:width: 1936
:alt: postgresql - repeatable read part 4

Мы по-прежнему получаем те же 3 записи, что и раньше.
**phantom read** также предотвращается на этом **repeatable read**
уровне изоляции.

Теперь я попытаюсь запустить
этот запрос уменьшения баланса учетной записи обновления,
в transaction 2
чтобы посмотреть, как он себя ведет:


.. image:: ../../img/postgresql/017-repeatable-read-5.png
:width: 1938
:alt: postgresql - repeatable read part 5

На уровне изоляции MySQL repeatable read
мы видели, что он позволяет обновить баланс до 60 долларов.
Но здесь, в Postgres, у нас появляется ошибка:

ОШИБКА: не удалось сериализовать доступ
из-за одновременного обновления

Я думаю, что выбрасывание подобной ошибки намного лучше,
чем изменение баланса,
потому что это позволяет избежать запутанного состояния,
когда транзакция увидела, что вычитание 10 из 80 дает 60.
Так что слава Postgres!

rollback;


Аномалия сериализации в Postgres
--------------------------------

До сих пор мы сталкивались с 3 типами явлений:
**dirty read**, **non-repeatable read**, и **phantom read**.
Но мы еще не столкнулись **serialization anomaly**.
Так что в этот раз посмотрим, как это будет выглядеть.

Давайте запустим 2 новые транзакции
и установим для них уровень изоляции **repeatable-read**.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 9afeadc

Please sign in to comment.