2016-02-20 2 views
11

Я действительно не уверен, когда дело доходит до блокировки весной jpa.
Поэтому, пожалуйста, рассмотрите этот вопрос как разъяснение. Я очень надеюсь, что понял это правильно, но мой английский не очень хорош для понимания сложных сообщений в блогах.
Так это то, что я думаю, что я получил от некоторых статей:Весна JPA Lock

Есть два основных типа блокировки:

  • оптимизм следует использовать, когда менее операция записи не планируется. операция чтения не будет блокировать объект.
    Например: у вас есть «денежный баланс», плавающий в объекте с оптимистичной блокировкой. Теперь два процесса читают это значение и используют его для вычисления и прочее. Один из них теперь изменяет значение и записывает его в базу данных с обновлением. Никакой ошибки до этого момента.
    Но теперь другой процесс также изменяет значение и хочет его обновить. Теперь есть ошибка. Это произошло только из-за второго обновления.
    Если бы второй процесс удалил экземпляр, ничего бы не получилось.
  • пессимистический следует использовать, когда планируется большая операция записи. операция чтения заблокирует объект.
    Например: у вас есть «денежный баланс», плавающий в сущности с пессимистической блокировкой. Один процесс считывает данные/значение с помощью «findOne».
    После этого другой процесс хочет также прочитать данные, что было бы возможно с оптимистичной блокировкой, но с пессимистичной блокировкой он должен теперь ждать (нет ошибки, просто подождите).
    Когда процесс 1 готов (изменение значения и его обновление), процесс 2 может продолжаться.

Первые вопросы: это правильно? И когда я теперь хочу проверить эту knollage, я могу выбрать между этим LockModeType-х:

  • ОПТИМИСТИЧЕСКАЯ
  • OPTIMISTIC_FORCE_INCREMENT
  • PESSIMISTIC_READ
  • PESSIMISTIC_WRITE
  • PESSIMISTIC_FORCE_INCREMENT

Почему там сейчас так много субблокировок и что они делают? Когда «ОПТИМИЗАЦИЯ» - это оптимистичная блокировка сверху, которую я пытался понять, то что такое «OPTIMISTIC_FORCE_INCEMENT»?
И что же касается обновления версии? (или @version?)

Отправляясь:
Есть три основных применения замка в Спринг JPA:

  1. на обычной колонке, например:

    @Entity 
    public class PersonEntity { 
        @Id 
        @GeneratedValue(strategy = GenerationType.AUTO) 
        private Long id; 
    
        @Lock(LockModeType.PESSIMISTIC_WRITE) 
        private String name; 
    } 
    
  2. на внешний ключ к другой таблицы, например:

    @Entity 
    public class PersonEntity { 
        @Id 
        @GeneratedValue(strategy = GenerationType.AUTO) 
        private Long id; 
    
        @Lock(LockModeType.PESSIMISTIC_WRITE) 
        @OneToOne 
        private Group group; 
    } 
    
  3. на столе внутри хранилища, например:

    interface PersonRepository extends Repository<Person, Long> { 
        @Lock(LockModeType.PESSIMISTIC_WRITE) 
        Person findOne(Long id); 
    } 
    

Блокировка Entity непосредственно

@Entity 
@Lock(LockModeType.PESSIMISTIC_WRITE) 
public class PersonEntity { } 

не представляется возможным. Поэтому вы можете использовать 3 (заблокировать внутри репозитория).

Второй вопрос: Это правильно? Я забыл об использовании блокировки?


Идея блокировки заключается в том, что другим методам/процессам приходится ждать, пока блокировка не будет выпущена (за исключением оптимистической блокировки, здесь возникает ошибка).
Блокировка существует до тех пор, пока экземпляр/объект активен или до следующего фиксации.
Существуют две основные возможности, чтобы разблокировать объект:

  1. В транзакции: В этом методе полной блокировки активен. Но когда придет возврат, замок будет удален.

    @Transactional 
    public void test(){ 
        System.out.println("start, but not locked yet"); 
        PersonEntity person1 = personRepository.findOne(1L); // locks this person or must wait, when locked 
        System.out.println("now locked"); 
        // do something 
        return true; // now the lock will be deleted -> unlocked again 
    } 
    
  2. до тех пор, пока объект не будет удален: Данные будут заблокированы при выборе объекта, и данные будут разблокированы, когда объект будет удален.

    public void test(){ 
        System.out.println("start, but not locked yet"); 
        PersonEntity person1 = personRepository.findOne(1L); // locks this person or must wait, when locked 
        System.out.println("now locked"); 
        // do something 
        person1 = null; // now the lock will be deleted -> unlocked again 
        System.out.println("not locked anymore"); 
        // do something more 
        return true; 
    } 
    

Третьи Вопросы: правильно ли это до сих пор? Может ли эта функция действительно ждать, тогда данные заблокированы? Может ли замок действительно быть удален, если объект установлен на null?

Последние слова:
Я действительно надеюсь, что я никого не потревожу. Но, как я сказал, мне очень сложно понять такие сложные структуры на английском языке :(
Так что спасибо за помощь в любой форме :) Я очень ценю любую небольшую помощь. независимо от того, вы даете ссылки меня для большего понимания и отвечать на мои вопросы прямо :)

+0

В двух словах, в типичных интерактивных приложениях, особенно в веб-приложениях, любая форма пессимистического замка редко требуется, и это не имеет смысла. 'OPTIMISTIC_FORCE_INCREMENT' необходим только тогда, когда вам нужно заблокировать весь объект, включая его содержащие объекты, что также случается довольно редко. В большинстве случаев вас беспокоит только '@ javax.persistence.Version'. – Tiny

+0

Вы действительно попробовали какие-либо опции, чтобы подтвердить свое понимание? –

+0

да, кроме разблокировки. – christopher2007

ответ

1

Блокировка

Блокировка используется для предотвращения грязного чтения (чтение данных, которые не были зафиксированы) и неповторяющиеся чтение (чтение данные, которые удаляются другой транзакцией до завершения одного чтения).

Оптимистичный

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

Оптимистичный сила приращения

Для версионированных объектов, это увеличит номер версии объекта. На объектах, не связанных с версией, будет выбрано исключение.

Пессимистический

Пессимистический чтения

Для повторяемые чтения, используется для обеспечения того, что данные не обновляются между чтениями. Это общий замок, означающий, что различные процессы могут выполнять операции чтения (операции записи не разрешены).

Пессимистический записи

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

Пессимистических записи сила приращения

Аналогичны оптимистического коллеги пессимистической записи, которая обновляет версию объекта. Выдает исключение для объектов без версии.