Гарантируйте уникальность определенных значений, используя REPEATABLE READ - PullRequest
0 голосов
/ 28 мая 2018

у нас есть простая таблица:

Human:
+------+
|Height|
+------+
|      |
+------+

и у меня есть метод, который добавляет человека:

@AutoWired 
HumanRepository humanRepo; // JpaRepository

@Transactional(isolationLevel = REPEATABLE_READ)
void addHuman(int height){
    if(humanRepo.existsByHeight(height){
      throw new HumanWithSuchHeightExists();
    }
    humanRepo.save(Human.builder().height(height).build())
}

И я хотел бы гарантировать, что существует ровно один человек судельная высота.

  1. Гарантирует ли REPEATABLE_READ, что?
  2. Правильно ли мой код (псевдокод) для выполнения этого условия?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Да, PostgreSQL SERIALIZABLE не должен создавать более одной записи одинаковой высоты.Это прервет или T1 или T2.

Я думаю, что аномалия была бы формально названа Анти-Зависимым Циклом (G2).Вот хороший справочник, который включает основные базы данных

Кроме того, почему бы вместо этого не использовать уникальное ограничение вместо?

0 голосов
/ 28 мая 2018

Теория говорит, что единственный уровень изоляции, который способен к абсолютным гарантиям re.Целостность данных (в соответствии с объявленными правилами) SERIALIZABLE.

С REPEATABLE READ теоретически вы все еще подвергаетесь риску двух транзакций, пытающихся вставить одну и ту же строку, и следующей последовательности событий, позволяющих пройти это:

T1 проверяет существование строки, строка не существует
T2 проверяет существование строки, строка не существует
T1 вставляет, возможно, повторяя проверку существования строки (все еще не существует)
T2вставки, возможно повторяя проверку существования строки (все еще "не существует", потому что T1 еще не зафиксировал, поэтому его новые вставленные данные остаются невидимыми для T2).
T1 фиксирует
T2 фиксирует

REPEATABLE READ, как следует из названия, предоставляет гарантии только в отношении существующих строк (а именно: , если строка обнаружена, она не будет изменена другими транзакциями итогда чтение становится «повторяемым»).

...