Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Pessimistic lock (EJB3.1 and JPA2) / 14 сообщений из 14, страница 1 из 1
04.05.2013, 15:29:34
    #38247728
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
Добрый день.

Есть такой класс:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
@Stateless(name = BeanRemote.NAME, mappedName = BeanRemote.MAPPED_NAME)
@Remote(BeanRemote.class)
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class BalanceBean implements BeanRemote {
	
    @PersistenceContext(unitName = "PERSISTENCE_UNIT_NAME")
    private EntityManager em;
	
    public void methodForBalance(){
	BalanceEntity balanceEntity = em.find(BalanceEntity.class, 2L); 

        //задержка 3 секунды, что бы проверить работу метода при одновременном доступе
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

	em.refresh(balanceEntity, LockModeType.PESSIMISTIC_WRITE);
	
	balanceEntity.setBalance(balanceEntity.getBalance() + 1);
	em.merge(balanceEntity);
    }
}



Метод methodForBalance может запускаться одновременно в разных потоках и иметь разные транзакции:
--
T -transaction
U - user
stls - экземпляр класса BalanceBean

Thread1 and T1 :
пользователь U1 вызывает stls1.methodForBalance()

Thread2 and T2 :
пользователь U2 вызывает stls2.methodForBalance()
--

Когда в одно и то же время запускаю метод methodForBalance в stateless бине, то строка
em.refresh(balanceEntity, LockModeType.PESSIMISTIC_WRITE);
не выполняет блокировку, а если изменить этот бин изменить на singleton, то блокировка произойдет
и данные обновятся корректно.

Не могли бы вы объяснить почему так происходит.
Получается, что в пределах одной транзакции pessimistic lock срабатывает,
а в разных транзакциях нет?

Запускаю приложение на jboss as 7.1.

Спасибо.
...
Рейтинг: 0 / 0
04.05.2013, 15:50:51
    #38247739
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
korotin,
В случае с синглетоном, если вы не меняли блокировку его методов по умолчанию, то она Lock.WRITE, это значит метод не может вызываться параллельно несколькими потоками. Поэтому у вас все и работает. То есть спасает не LockModeType.PESSIMISTIC_WRITE, а синхронизация метода синглетона.
...
Рейтинг: 0 / 0
04.05.2013, 16:02:48
    #38247749
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
wessenkorotin,
В случае с синглетоном, если вы не меняли блокировку его методов по умолчанию, то она Lock.WRITE, это значит метод не может вызываться параллельно несколькими потоками. Поэтому у вас все и работает. То есть спасает не LockModeType.PESSIMISTIC_WRITE, а синхронизация метода синглетона.

Кстати да, об этом я не подумал, спасибо.
...
Рейтинг: 0 / 0
04.05.2013, 16:16:06
    #38247757
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
Возможно кто-то использовал pessimistic lock(read/write) для jpa2 при вызове из stateless бинов, подскажите как
эта блокировка работает?
Еще я запускаю приложение в jboss as7.1, может проблема в нем?

Для optimistic lock необходимо поле для контроля версии и когда происходит обновление данных, тогда поле версии тоже обновляется и при этом если в другой транзакции происходит обновление такой же сущности со старой версией, то возникает exception.

Для Pessimistic lock(read/write) не требуется поле версии и эта блокировка синхронизирует доступ к одной и той же сущности, если я правильно понимаю.

Мне нужно синхронизировать одновременный доступ к сущности для корректного обновления данных.
Возможно есть другой способ?
...
Рейтинг: 0 / 0
04.05.2013, 19:22:13
    #38247834
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
Пара идей:
1. А что если добавить LockModeType.PESSIMISTIC_WRITE в метод find? Мне кажется, что о пессимистичной блокировке должно быть известно уже на этапе получения объекта.
2. Также скорее всего имеет смысл глянуть какая СУБД используется, а то вроде как пессимистичная блокировка работает на основе блокировок самой СУБД, может там чего подкручено?
...
Рейтинг: 0 / 0
04.05.2013, 22:52:50
    #38247939
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
just_vladimirПара идей:
1. А что если добавить LockModeType.PESSIMISTIC_WRITE в метод find? Мне кажется, что о пессимистичной блокировке должно быть известно уже на этапе получения объекта.
2. Также скорее всего имеет смысл глянуть какая СУБД используется, а то вроде как пессимистичная блокировка работает на основе блокировок самой СУБД, может там чего подкручено?

Первый пункт проверял - не работает.
Второй пункт надо смотреть.
Если что использую MySQL 5.5.
...
Рейтинг: 0 / 0
04.05.2013, 23:58:51
    #38247970
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
korotin,
ставили show sql в true и смотрели, какие запросы генерирует hibernate, выполняется ли select for update или что то другое?
...
Рейтинг: 0 / 0
05.05.2013, 00:53:39
    #38247982
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
just_vladimirkorotin,
ставили show sql в true и смотрели, какие запросы генерирует hibernate, выполняется ли select for update или что то другое?

Да выполняется select for update.
...
Рейтинг: 0 / 0
05.05.2013, 11:38:10
    #38248069
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
korotinjust_vladimirkorotin,
ставили show sql в true и смотрели, какие запросы генерирует hibernate, выполняется ли select for update или что то другое?
Да выполняется select for update.
какой смысл лочить - тормозить и одновременно паралелить с помощью потоков?
...
Рейтинг: 0 / 0
05.05.2013, 12:01:30
    #38248075
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
korotin,
ради эксперимента поставте какой-нибудь PostgreSQL и прогоните тест на нем.

Petro123,
на сколько я себе представляю, в одном случае выстроится в очередь и последовательно выполнится, в другом же одно выполнится, а второе должно свалиться с исключением.
...
Рейтинг: 0 / 0
05.05.2013, 12:06:45
    #38248078
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
just_vladimir,
да. Выполнится только одно, которое успело заблокировать.
Т.е. никакой параллельности нету. Синглетон или одни ворота для всех потоков.
Используются для длинных транзакций в клиент-серверах, но не в веб.
...
Рейтинг: 0 / 0
05.05.2013, 19:11:25
    #38248260
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
just_vladimirkorotin,
ради эксперимента поставте какой-нибудь PostgreSQL и прогоните тест на нем.


Проверил, данные изменяются корректно, в отличии от mysql.
Затем почистил temp у jboss, запустил пример и данные изменились как надо для mysql.
Странно, буду тестировать.
...
Рейтинг: 0 / 0
05.05.2013, 23:24:06
    #38248364
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
Всем спасибо за предложенные варианты, пример работает как надо.
...
Рейтинг: 0 / 0
05.05.2013, 23:26:32
    #38248367
korotin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Pessimistic lock (EJB3.1 and JPA2)
Кстати последняя строка em.merge(balanceEntity); лишняя.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Pessimistic lock (EJB3.1 and JPA2) / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]