2014-10-13 1 views
0

В настоящее время я столкнулся с проблемой блокировки объекта в JPA. У меня есть список нескольких объектов из базы данных. Для каждого элемента есть кнопка редактирования, которая загружает представление для редактирования этой записи. Каждый раз, когда клиент пытается редактировать запись, я хочу проверить, заблокирован ли объект, чтобы клиент даже не загружал маску редактирования объекта.Заблокирование объекта

Мой метод, который загружает объект:

[...] 
mail = (EMailKonto) query.getSingleResult(); 
System.out.println(getLock(mail).toString()); 
setLock(mail, LockModeType.PESSIMISTIC_WRITE); 
System.out.println(getLock(mail).toString()); 

Вызываемые методы:

public void setLock(T entity, LockModeType lock) 
{ 
getEntityManager().lock(entity, lock); 
} 

public LockModeType getLock(T entity) 
{ 
    return getEntityManager().getLockMode(entity); 
} 

Что происходит, что первый syso печатает NONE, так как там не применяется блокировка не. Затем блокировка устанавливается, а вторая syso печатает PESSIMISTIC_WRITE. Когда я обновляю страницу или пользуюсь другой вкладкой/браузером и нажимаю кнопку редактирования того же объекта, первое syso должно печатать PESSIMISTIC_WRITE, так как я никогда не удаляю блокировку, но снова печатает NONE. Не могли бы вы, ребята, помочь мне понять, как реализовать такую ​​функцию?

Привет

+0

(Я использую Glassfish 3.X и таблицу MySQL InnoDB) –

ответ

2

Технически, пессимистический замок осуществляется с помощью выдачи SELECT ... FOR UPDATE команду, которая блокирует строку (ы) для текущей операции, так что любое другой SELECT ... FOR UPDATE, а также ОБНОВЛЕНИЕ в другой транзакции не будет выполнено.

Все блокировки на уровне транзакции освобождаются при завершении транзакции, поэтому такая реализация не представляется возможной для необходимой вам функциональности, поскольку вам нужно будет сохранять транзакции, пока клиент редактирует строку. Можно реализовать в тяжелом клиенте (хотя и ужасный дизайн), но в веб-приложении не реалистично, потому что у вас даже нет обратной связи, если клиент закрывает браузер.

Вам необходимо вручную внедрить и управлять замками на уровне бизнеса, сохранив «блокировки» в отдельной таблице. Блокировки уровня транзакции (пессимистичные): не, предназначенные для работы в качестве замков бизнес-уровня. Это низкоуровневый механизм, предназначенный для утверждения последовательности транзакций.