Оптимистическая блокировка с полем "версия" против уровня изоляции снимка

Мне было интересно, что является преимуществом / неудобством для этих двух оптимистических решений блокировки:

  1. Используйте поле "версия" и обнаруживайте изменения во время обновлений (например, используя аннотацию hibernate @Version)

  2. Используйте уровень изоляции Снимок в транзакциях

Если я прав, эти два решения имеют одинаковое поведение: будет выдана ошибка, если строка была обновлена ​​во время транзакции

Спасибо

1 ответ

Решение

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

Изоляция моментальных снимков проверяет все столбцы и не сравнивает данные. Любая запись, даже нулевая запись, такая как x = x на счет.

Изоляция моментальных снимков также гарантирует моментальный снимок для чтения. Вы не сказали, какой уровень изоляции вы собираетесь использовать (1). Я предполагаю, что это не SNAPSHOT. По этой причине (2) может предложить вам гарантии, которые Hibernate не может предложить самостоятельно.

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

Обратите внимание, что оба решения не сериализуемы, так как они проверяют записи, но не читают.

Другие вопросы по тегам