Почему PostgreSQL прерывает этот сериализуемый график - PullRequest
0 голосов
/ 12 июня 2018

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

Теперь следующее параллельное выполнение транзакций T1 и T2 является сериализуемымпотому что это эквивалентно последовательному выполнению «T1 затем T2»

T1: r1x   w1y  c1
T2:    w2x   c2

(i.e., T1 reads x, T2 writes x, T1 writes y, T2 commits, and finally, T1 commits)

Однако при попытке в PostgreSQL 10.4, например так:

T1: begin
T1: set transaction isolation level serializable;
T2: begin
T2: set transaction isolation level serializable;
T2: update variables set value = value + 1 where name = 'x'
T1: update variables set value = value + 1 where name = 'y'
T2: commit
T1: commit

база данных прерывает T1, когда эта транзакцияпытается совершить.Почему?

1 Ответ

0 голосов
/ 12 июня 2018

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

Но я подозреваю, что в этом случае другая причина.Если вы посмотрите на планы выполнения, вы, вероятно, увидите последовательное сканирование.Теперь при последовательном сканировании читается всех строк, поэтому при обновлении T2 прочитал y.

Поведение сериализуемых транзакций зависит от выбранного плана выполнения!

...