|
|
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть такой класс: Код: 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. Метод 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. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2013, 15:29:34 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
korotin, В случае с синглетоном, если вы не меняли блокировку его методов по умолчанию, то она Lock.WRITE, это значит метод не может вызываться параллельно несколькими потоками. Поэтому у вас все и работает. То есть спасает не LockModeType.PESSIMISTIC_WRITE, а синхронизация метода синглетона. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2013, 15:50:51 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
wessenkorotin, В случае с синглетоном, если вы не меняли блокировку его методов по умолчанию, то она Lock.WRITE, это значит метод не может вызываться параллельно несколькими потоками. Поэтому у вас все и работает. То есть спасает не LockModeType.PESSIMISTIC_WRITE, а синхронизация метода синглетона. Кстати да, об этом я не подумал, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2013, 16:02:48 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
Возможно кто-то использовал pessimistic lock(read/write) для jpa2 при вызове из stateless бинов, подскажите как эта блокировка работает? Еще я запускаю приложение в jboss as7.1, может проблема в нем? Для optimistic lock необходимо поле для контроля версии и когда происходит обновление данных, тогда поле версии тоже обновляется и при этом если в другой транзакции происходит обновление такой же сущности со старой версией, то возникает exception. Для Pessimistic lock(read/write) не требуется поле версии и эта блокировка синхронизирует доступ к одной и той же сущности, если я правильно понимаю. Мне нужно синхронизировать одновременный доступ к сущности для корректного обновления данных. Возможно есть другой способ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2013, 16:16:06 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
Пара идей: 1. А что если добавить LockModeType.PESSIMISTIC_WRITE в метод find? Мне кажется, что о пессимистичной блокировке должно быть известно уже на этапе получения объекта. 2. Также скорее всего имеет смысл глянуть какая СУБД используется, а то вроде как пессимистичная блокировка работает на основе блокировок самой СУБД, может там чего подкручено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2013, 19:22:13 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
just_vladimirПара идей: 1. А что если добавить LockModeType.PESSIMISTIC_WRITE в метод find? Мне кажется, что о пессимистичной блокировке должно быть известно уже на этапе получения объекта. 2. Также скорее всего имеет смысл глянуть какая СУБД используется, а то вроде как пессимистичная блокировка работает на основе блокировок самой СУБД, может там чего подкручено? Первый пункт проверял - не работает. Второй пункт надо смотреть. Если что использую MySQL 5.5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2013, 22:52:50 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
korotin, ставили show sql в true и смотрели, какие запросы генерирует hibernate, выполняется ли select for update или что то другое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2013, 23:58:51 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
just_vladimirkorotin, ставили show sql в true и смотрели, какие запросы генерирует hibernate, выполняется ли select for update или что то другое? Да выполняется select for update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2013, 00:53:39 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
korotinjust_vladimirkorotin, ставили show sql в true и смотрели, какие запросы генерирует hibernate, выполняется ли select for update или что то другое? Да выполняется select for update. какой смысл лочить - тормозить и одновременно паралелить с помощью потоков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2013, 11:38:10 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
korotin, ради эксперимента поставте какой-нибудь PostgreSQL и прогоните тест на нем. Petro123, на сколько я себе представляю, в одном случае выстроится в очередь и последовательно выполнится, в другом же одно выполнится, а второе должно свалиться с исключением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2013, 12:01:30 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
just_vladimir, да. Выполнится только одно, которое успело заблокировать. Т.е. никакой параллельности нету. Синглетон или одни ворота для всех потоков. Используются для длинных транзакций в клиент-серверах, но не в веб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2013, 12:06:45 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
just_vladimirkorotin, ради эксперимента поставте какой-нибудь PostgreSQL и прогоните тест на нем. Проверил, данные изменяются корректно, в отличии от mysql. Затем почистил temp у jboss, запустил пример и данные изменились как надо для mysql. Странно, буду тестировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2013, 19:11:25 |
|
||
|
Pessimistic lock (EJB3.1 and JPA2)
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за предложенные варианты, пример работает как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2013, 23:24:06 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38248364&tid=2129419]: |
0ms |
get settings: |
15ms |
get forum list: |
22ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
38ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 281ms |
| total: | 443ms |

| 0 / 0 |
