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

В упрощенной версии проблемы у меня есть две транзакции, которые обновляют одну строку:

UPDATE A SET X = 1

И

SELECT X FROM A
UPDATE A SET Y = 3

Проблема в том, что мы запрашиваем X, потому что есть зависимость от данных для правильного значения Y, но фактическая формула заранее неизвестна. Это может быть Y = X + c, где c - пользовательский ввод.

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

Как приложение может выражать такие зависимости данных?

Может ли обновление строк помочь в этом? Например:

SELECT X FROM A       -- returns X`
UPDATE A SET Y = 3

-- cause rollback if any concurrent transaction changes
-- any value within transitive closure of our local data dependencies
UPDATE A SET X = X`

В идеале, я надеюсь, что то же решение будет работать с STM подходом, когда приложение локально разрешит большинство конфликтов и выдаст одно обновление за раз.

...