Может ли транзакция быть зафиксирована и сериализована раньше других? - PullRequest
0 голосов
/ 07 июня 2018

В этой википедии страница можно прочитать:

In the other strategy, as used in multiversion concurrency control, 
Transaction 2 is permitted to commit first, which provides for better 
concurrency. However, Transaction 1, which commenced prior to Transaction 2, 
must continue to operate on a past version of the database — a snapshot of the 
moment it was started. When Transaction 1 eventually tries to commit, the DBMS 
checks if the result of committing Transaction 1 would be equivalent to the 
schedule **T1, T2**. If it is, then Transaction 1 can proceed. If it cannot be 
seen to be equivalent, however, Transaction 1 must roll back with a 
serialization failure.

Не должно ли последнее расписание быть T2, T1 вместо T1, T2 ?

Я спрашиваю об этом, потому что если T2 был зафиксирован до T1, то его эффекты уже видны для других транзакций, но эффекты T1 не таковы, потому что T1 еще не зафиксирован.Кажется очень странным, если однажды совершенный T1 мог появиться перед T2 и другими транзакциями, совершенными в это время - это было бы как запись в прошлом.

Но если я ошибаюсь, то есть, если это возможнодля текущей транзакции, когда-то совершенной, чтобы внезапно появиться перед другими, которые были совершены ранее, я хотел бы, чтобы кто-то объяснил почему, если это возможно, убедительным примером.

Спасибо

Ответы [ 2 ]

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

Для определения сериализуемости между двумя транзакциями нужны только зависимости между их чтениями и записями, а не их фиксации или их прерывания (очевидно, для прерываний).

Так, в примере, если T1 запущен раньшеT2 и T2 были зафиксированы, но еще не T1, тогда их расписание сериализуемо, т. Е. T1 может быть зафиксировано, если оно эквивалентно любому из «T1, затем T2» или «T2, затем T1».Не имеет значения, кто совершил первый.

Таким образом, страница в Википедии верна: фактическое расписание должно быть эквивалентно последовательному расписанию «T1 затем T2», потому что T1 считывает значение до того, как T2 его записал.

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

Вероятно, это сложный способ сказать, что если T1 пытается обновить строку, измененную с помощью T2 после запуска T1, T1 получит ошибку сериализации.

Порядок T1, T2означает, что результат Т2 преобладает.T1 перезаписывает результат T2, что нарушает его, поэтому T1 отменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...