Видимость других транзакций внутри данного - PullRequest
0 голосов
/ 13 декабря 2018

Как Postgres решает, какие транзакции видны для данной транзакции в соответствии с уровнем изоляции?

Я знаю, что Postgres использует xmin и xmax и сравнивает его с xid, но у меня нетНе нашли статьи с правильными деталями.

Вы знаете процесс под капотом?

1 Ответ

0 голосов
/ 13 декабря 2018

Это зависит от текущего снимка .

READ COMMITTED транзакции делают новый снимок для каждого запроса, в то время как транзакции REPEATABLE READ и SERIALIZABLE делают снимок при первом запросевыполняется и хранит его на протяжении всей транзакции.

Снимок определяется как struct SnapshotData в include/utils/snapshot.h и по существу содержит следующее:

  • aминимальный идентификатор транзакции xmin: для этого снимка видны все более старые транзакции.

  • максимальный идентификатор транзакции xmax: все последующие транзакции не видны для этого снимка.

  • массив идентификаторов транзакций xid, который содержит все промежуточные транзакции, которые не видны для этого снимка.

Чтобы определить, является ли кортеж видимымдля моментального снимка его xmin должен быть видимым идентификатором подтвержденной транзакции, а xmax не должен быть видимым идентификатором подтвержденной транзакции.

Чтобы определить, зафиксирована транзакция или нет, Журнал коммитов необходимо просмотреть, если биты подсказок кортежа (которые кешируют эту информацию) уже не были установлены.

...