Реализация оптимистичного параллелизма на устаревшей базе данных - PullRequest
7 голосов
/ 21 июня 2011

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

Мне было интересно, что будет лучшим способом.

Запрос сна стороне приложения будет создан предикат.

Меня интересует, как сохранить значение конверсии строки (отметка времени).

Сначала я подумал об использовании ora_rowscn длязначение rowversion, но потом я понял, что мне нужно заново создать все таблицы для установки ora_rowscn .Может быть, было бы неплохо добавить какой-нибудь столбец отметки времени, но тогда я был бы вынужден создавать и сохранять новое значение отметки времени для каждого обновления в приложении.

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 21 июня 2011

Oracle имеет встроенный пакет для оптимистической блокировки, который называется OWA_OPT_LOCK . Это можно использовать для генерации контрольной суммы для любой строки, подобной этой:

select owa_opt_lock.checksum('SCOTT','EMP',ROWID)
from emp
where empno = 123;

Это можно вызвать при первоначальном получении записи и еще раз перед сохранением изменений; если значения 2 разные, кто-то другой изменил запись с момента ее получения.

4 голосов
/ 21 июня 2011

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

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

...