В упрощенной версии проблемы у меня есть две транзакции, которые обновляют одну строку:
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
подходом, когда приложение локально разрешит большинство конфликтов и выдаст одно обновление за раз.