|
|
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Есть задача по реализации версионности сущностей: например при вставке обновлять данные в таблице сущности, а старые данные добавлять в другую Я предполагал сделать это с помощью триггеров базы НО начальство в лице нескольких человек с пеной у рта доказывает что мы пишем систему максимально не зависящую от БД и поэтому реализовывать эту вещь должны бины Я в смятении :) - это вообще нормальная техника, кто то с таким сталкивался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 17:57 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Вообще - бывает и такое. Но если есть возможность реализовать ведение истории через триггеры или ХП - лучше делать через них. Запрос к базе фактически будет один. В случае с EJB это выльется в два, а то и три запроса. Три запроса как правило медленнее, чем один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 18:06 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Так в том то и дело - и при том что это будет делаться на сервере приложений - то есть данные будут тянуться туда, обрабатываться а потом обратно в БД - не накладно ли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 18:22 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Это действительно оговорено, что БД может быть любая, или уже есть преценденты использования спечифичесткого для определенной(-ых) БД кода? Еще, будут ли данные в БД меняться только через через эти самые бины, или возможны другие варианты (консоль, другое приложение)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 18:33 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Ну так если действительно требуется максимальная независимость от БД, то по другому то и не сделать. Нужно поконкретнее разобратся с этой независемостью, нужна ли она вообще, если в ближайшем будущем не планируется менять БД, то пишем тригеры, иначе EJB... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 18:37 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
KPIISЕсть задача по реализации версионности сущностей: например при вставке обновлять данные в таблице сущности, а старые данные добавлять в другую Я предполагал сделать это с помощью триггеров базы НО начальство в лице нескольких человек с пеной у рта доказывает что мы пишем систему максимально не зависящую от БД и поэтому реализовывать эту вещь должны бины Я в смятении :) - это вообще нормальная техника, кто то с таким сталкивался? это означает "максимально не зависящую от конечного результата". Вот 3 аксиомы "теории базонезависимости" 1. Реляционная база - это черный ящик, где лежат плоские таблицы. 2. Кроме плоских таблиц в реляционной базе ничего нет 3. Все реляционные базы одинаковые Отсюда вытекает много интересных выводов. И в частноти про триггеры. А кроме того полной обструкции подлежат foreign key, управление транзакциями, откатами и блокировками. И многое чего другое. Суть этого подхода простая - сделать надо быстро и продать надо как можно больше. Если делать "базозависимую" систему то прийдется писать очень много разного кода. А "базонезависимое" решение позволяет сэкономить кучу времени и обеспечить широкий круг продаж. То что "базонезависимая" система будет не (совсем) работоспособна - вторично. Мне кажется, если ваше начальство всерьез выбрало "базонезависимую" архитектуру, то ваши шансы на триггеры равны нулю, потому что они противоречат фундаментальному принципу "базонезависимых" систем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 18:48 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
1)с какой радости для базозависимой системы нужно больше кода чем для независимой? 2)Где вы видели подход "сделать надо медленно и продать как можно меньше"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 18:54 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Школяр Отсюда вытекает много интересных выводов. И в частноти про триггеры. А кроме того полной обструкции подлежат foreign key, управление транзакциями,откатами и блокировками. И многое чего другое. линки и блокировки реализуется прекрасно средствами EJB ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2005, 20:25 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Школяр...Если делать "базозависимую" систему то прийдется писать очень много разного кода. А если делать базонезависимую систему, то придется писать еще больше кода, но в других местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 10:29 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Кувалдин Роман Школяр...Если делать "базозависимую" систему то прийдется писать очень много разного кода. А если делать базонезависимую систему, то придется писать еще больше кода, но в других местах. Скорее всего этот код будет написан уже для вас, в случае базонезависимой системы, что-нибудь типа orm средства наподобии Hibernate - ведь вы можете его юзать, практически не обращая внимания на особенности того, где это будет разворачиваться. И создавать более абстрагированную систему будет дешевле - и по срокам, и по тому, что меньше специалистов придётся нанимать из разных сфер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 12:21 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
О чем спорим? во-первых, Entity Bean'ы фактически умирающая технология... во-вторых, тригеры в основном используются для реализации сложных ограничений целостности, а не для бизнес логики приложения... ладно бы спорили stored procs vs EJB, а то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 12:24 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
во-первых, Entity Bean'ы фактически умирающая технология... а почему? чем они хуже JDO or Hibernate? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 12:33 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
funikovyuri во-первых, Entity Bean'ы фактически умирающая технология... во-вторых, тригеры в основном используются для реализации сложных ограничений целостности, а не для бизнес логики приложения... ладно бы спорили stored procs vs EJB, а то... чего это они стали умирающей технологией? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 12:35 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
см. EJB 3.0 & JSR 220 коротко - entity уходят как слишком тяжелое решение и вместо них приходит JDO/EJB3 и персистизация pojo-классов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 12:59 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
В EJB3.0 просто любой класс может быть entity - но концепция то не меняется... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 13:03 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Ну EJB3.0 это всё таки тоже EJB. Тем более когда они ещё выйдут и уж тем паче внедрятся. Тем более что вопрос если я правильно понял всётаки не о перспективах EJB, а о том стоит ли базо-независимость обменивать на гимор разработчиков + возможные тормоза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 13:04 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Ну EJB3.0 это всё таки тоже EJB. А кто спорит, я сказал что ENTITY EJB умирают и на их место приходит POJO-persistence а ля Hibernate&JDO. Не знаю кто как - а я считаю что EJB3 от этого только выиграет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 13:07 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
funikovyuri во-вторых, тригеры в основном используются для реализации сложных ограничений целостности, а не для бизнес логики приложения... кстати интересно разделили понятия целостность и бизнес-логика приложения :) - разве целостность не одна из составляющих бизнес-логики и не выводится как раз из требований к логике работы приложения ;)? и что значит "сложные ограничения"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 13:14 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
funikovyuriНу EJB3.0 это всё таки тоже EJB. А кто спорит, я сказал что ENTITY EJB умирают и на их место приходит POJO-persistence а ля Hibernate&JDO. Не знаю кто как - а я считаю что EJB3 от этого только выиграет Вот везёт Вам, а я с начала своего явского пути с EJB не сталкивался :( Сейчас работаю с hibernat-ом, видел где-то статьи о том, что дескать новый EJB будет почти как hibernate. Если Вам не сложно, плииз, в двух словах расскажите что это за зверь - EJB, и какие его основные отличимя/минусы по сравнению с hibernate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 13:23 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Сейчас работаю с hibernat-ом, видел где-то статьи о том, что дескать новый EJB будет почти как hibernate. В двух словах. Основой J2EE служит спецификация на EJB. EJB бывают Entity, Session и Message Driven... Так вот Entity бины в j2ee решают задачу сохранения объектов в каком-либо постоянном хранилище (например, в РБД) Точнее Entity бин это сущность, которая может быть сохранена. Session и MD бины в свою очередь реализуют бизнес логику, которая оперирует этими entity бинами. Паралельнно с развитием EJB появился JDO который решал, по сути, туже задачу, что и entity-бины, но для pojo классов. JDO это спецификация на ORM-средства в java. JDO не возлагал никаких специфических требований на классы, которые нужно сохранять в БД. Ну ясно что 2 api решающие одну задачу это не хорошо. Уже давно стало ясно, что из них выживет только один, но до недавнего времени не было ясно какой... Дело в том, что в EJB и вообще в J2EE было вложено очень много средств и была вероятность лоббирования дальнейшего развития JDO некоторыми крупными вендорами. Но вроде, судя по EJB3, основным api для персистизации объектов стал все-таки JDO2. Если вы работали с Hibernate то в EJB3 почувствуете себя как дома... Да и вообще JDO и hibernate всегда были сильно похожи и вообще странно что hibernate его не поддерживал с самого начала. И так EJB3 определяет спецификацию на средства персистизации pojo и в том числе метаинформацию, используемую EJB3-совместимым orm-средтвом для выполнения своей работы (то что в hibernate храниться в hbm-файлах). Единственным отличием является интенсивное использования аннотаций из j2se 1.5 вместо дополнительных файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 13:56 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
а как в EJB3.0 организована изоляция транзакций? Если сессия 1 пишет в запись X в базе данных, но не делает пока commit, а сессия 2 читает эту же запись X, то получит сессия 2 старую версию X, которая была до того, как ее изменила сессия 1? Или сессия 2 получит исключение, что запись недоступна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 17:22 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
а как в EJB3.0 организована изоляция транзакций? Если сессия 1 пишет в запись X в базе данных, но не делает пока commit, а сессия 2 читает эту же запись X, то получит сессия 2 старую версию X, которая была до того, как ее изменила сессия 1? Или сессия 2 получит исключение, что запись недоступна? EJB3 поддерживает как пессимистическую, так и оптимистическую стратегии реализации транзакций. В первом случае прочитанные данные блокируются в БД на период действия транзакции, во втором только в момент фиксации (т.е. commit'а), при этом согласованность достигается с помощью использования специального атрибута отвечающего за хранение текущей версии записи (обычно это timestamp атрибут) Все работает точно так же как и в самой БД так как все операции с persistence-capable объектами рано или поздно транслируются в SQL (в том числе операции управления транзакциями). Таким образом если вы в сессии 1 открыли транзакции то она, грубо говоря, открылась и в БД. Отличия в основном касаются расширенным возможностям по кэшированию данных на клиенте. Т.е. если вы выбрали оптимистичную стратегию, открыли транзакцию, а затем создали и сохранили 10 объектов то с точки зрения БД ничего еще не произошло, так как пока все это находится на клиенте. Зато как только вы выполнили commit для этой сессии в БД будет открыта транзакция, затем выполнены 10*n sql операций, требуемых для сохранения этих объектов и выдана sql команда commit. Т.е. все делается умно и по-закону... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 17:41 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
funikovyuriа как в EJB3.0 организована изоляция транзакций? Если сессия 1 пишет в запись X в базе данных, но не делает пока commit, а сессия 2 читает эту же запись X, то получит сессия 2 старую версию X, которая была до того, как ее изменила сессия 1? Или сессия 2 получит исключение, что запись недоступна? EJB3 поддерживает как пессимистическую, так и оптимистическую стратегии реализации транзакций. В первом случае прочитанные данные блокируются в БД на период действия транзакции, во втором только в момент фиксации (т.е. commit'а), при этом согласованность достигается с помощью использования специального атрибута отвечающего за хранение текущей версии записи (обычно это timestamp атрибут) Все работает точно так же как и в самой БД так как все операции с persistence-capable объектами рано или поздно транслируются в SQL (в том числе операции управления транзакциями). Таким образом если вы в сессии 1 открыли транзакции то она, грубо говоря, открылась и в БД. Отличия в основном касаются расширенным возможностям по кэшированию данных на клиенте. Т.е. если вы выбрали оптимистичную стратегию, открыли транзакцию, а затем создали и сохранили 10 объектов то с точки зрения БД ничего еще не произошло, так как пока все это находится на клиенте. Зато как только вы выполнили commit для этой сессии в БД будет открыта транзакция, затем выполнены 10*n sql операций, требуемых для сохранения этих объектов и выдана sql команда commit. Т.е. все делается умно и по-закону... вопрос был не о блокировках, а об уровне изоляций транзакций (transaction isolation level). Описанная модель блокировок нужна в том случае, когда сессия 2 пытается ИЗМЕНИТЬ ту же самую запись, которую уже поменяла сессия 1. В данном случае сессия 2 хочет просто прочитать запись, уже измененную в базе, но не зафиксированную. Выглядит это так: Сессия 1 на клиенте в момент t1 открывает транзакцию, считывает запись X и меняет в ней значение в поле A с 123 на 456, после этого делает UPDATE. Но COMMIT сессия 1 не делает, потому что в этой транзакции должны быть изменены и другие записи в базе. COMMIT будет выдан потом, когда изменены будут все нужные записи. В момент t2 (t2 > t1) сессия 2 считывает значение из поля A в записи X. Так как новое значение 456 в базе еще не зафиксировано, то актуальным является значение 123. Если вы сделаете SELECT с консоли базы данных, то непременно получите 123, а не 456. В момент t3 (t3 > t2) сессия 1 делает commit. Так вот вопрос: а что получит сессия 2 в момент t2 в архитектуре EJB3? 123, 456 или сообщение о том, что запись X заблокирована? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 18:04 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
NN-123 как я упоминал - все взаимодействие с БД все равно будет на SQL... так что если вы открыли транзакцию в repeatable read то и в СУБД будет открыта транзакция с таким же уровнем изоляции... стратегии о которых я говорил будут влиять на момент когда эта транзакция будет реально открыта. Т.е. например, при оптимистической блокировке: 1-я сессия прочитала объект 1-я сессия его изменила 2-я сессия прочитала его с TIL = repeatable read ** 1-я сессия делает commit (и на сервер БД идут команды типа begin tran update ... where id=? and timestamp=? commit) 2-сессия прочитала другой объект 2-сессия изменила этот второй объект 2-сессия делает commit на сервер уходит set transaction isolation level repeatableread begin tran * select .. from where id=obj1_id and timestamp=obj1_timestamp update .. where id=obj2_id and timestamp=obj2_timestamp commit и при выполнении (*) вылетает exception так как запись была изменена другой сессией в случае пессимистической блокировки вторая сессия бы просто ждала commit'а первой на шаге (**) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 18:32 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
funikovyuri NN-123 как я упоминал - все взаимодействие с БД все равно будет на SQL... так что если вы открыли транзакцию в repeatable read то и в СУБД будет открыта транзакция с таким же уровнем изоляции... стратегии о которых я говорил будут влиять на момент когда эта транзакция будет реально открыта. Т.е. например, при оптимистической блокировке: 1-я сессия прочитала объект 1-я сессия его изменила 2-я сессия прочитала его с TIL = repeatable read ** т.е. сессия 2 получит значение не из кэша EJB, а сделает новый SELECT к базе и получит старое значение "123"? funikovyuri в случае пессимистической блокировки вторая сессия бы просто ждала commit'а первой на шаге (**) Т.е. не смотря на то, что вторая сессия хочет только читать, она все равно будет заблокирована? Т.е. операция чтения тоже блокируется? Но база данных не блокирует операцию чтения. Во всяком случае Oracle точно не блокирует. Даже если запись X заблокирована сессией 1 (см. мой пример выше) в момент t1, то сессия 2 в момент t2 получит значение из базы и оно будет равно 123. Стало быть EJB будет тормозить операции чтения на ровном месте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2005, 19:28 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
NN-123 т.е. сессия 2 получит значение не из кэша EJB, а сделает новый SELECT к базе и получит старое значение "123"? Вообще, это уже по усмотрению конкретного продукта реализующего EJB3... Также на это влияет является ли этот кеш общим, ну и настройки самого кэша... Т.е. не смотря на то, что вторая сессия хочет только читать, она все равно будет заблокирована? Я привел сценарий работы для блокировочника... Для Oracle он будет несколько другим. Весь сценарий работы можно разделить на 2 этапа 1й это работа на стороне клиента (работа самого orm, кеша и т.д.) и 2й - работа механизмов СУБД. Каждый из них обязан поддерживать определенный протокол работы. Т.е. вы можете указать TIL для сессии, например serializable и эти 2 этапа должны будут выполнить свою работу в соответствии с этим TIL. Так вот особенности работы 2-го этапа, конечно же, зависят от конкретной СУБД. Для блокировочника это будут блокировки. EJB только использует контракт СУБД на обеспечение работы механизма транзакций. Сам EJB никаких блокировок в БД не добавляет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 11:18 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
NN-123 ..... Сессия 1 на клиенте в момент t1 открывает транзакцию, считывает запись X и меняет в ней значение в поле A с 123 на 456, после этого делает UPDATE. Но COMMIT сессия 1 не делает, потому что в этой транзакции должны быть изменены и другие записи в базе. COMMIT будет выдан потом, когда изменены будут все нужные записи. В момент t2 (t2 > t1) сессия 2 считывает значение из поля A в записи X. Так как новое значение 456 в базе еще не зафиксировано, то актуальным является значение 123. Если вы сделаете SELECT с консоли базы данных, то непременно получите 123, а не 456. В момент t3 (t3 > t2) сессия 1 делает commit. Так вот вопрос: а что получит сессия 2 в момент t2 в архитектуре EJB3? 123, 456 или сообщение о том, что запись X заблокирована? Получит примерно тоже что и в архитектуре 2.X . Синхронизация и взаимодействие конкурирющих транзакций определяются базой данных с которой работает ejb контейнер. Хотя деплоер и может выбрать при диплойменте режим блокировки optimistic/pessimistic, все возможные коллизии разрешаются на этапе коммита транзакции. Что касается вопроса: -в случае optimistic сессия 2 получит 123, -в случае pessimistic - сессия перейдет в режим ожидания снятия эксклюзивной блокировки сессии 1 на запись Х. В случае Оракла, select for update используется как способ создать эксклюзивной блокировку. PS это справедливо для уровней изоляции >= READ_COMMITED ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 11:53 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
deepsky NN-123 ..... Сессия 1 на клиенте в момент t1 открывает транзакцию, считывает запись X и меняет в ней значение в поле A с 123 на 456, после этого делает UPDATE. Но COMMIT сессия 1 не делает, потому что в этой транзакции должны быть изменены и другие записи в базе. COMMIT будет выдан потом, когда изменены будут все нужные записи. В момент t2 (t2 > t1) сессия 2 считывает значение из поля A в записи X. Так как новое значение 456 в базе еще не зафиксировано, то актуальным является значение 123. Если вы сделаете SELECT с консоли базы данных, то непременно получите 123, а не 456. В момент t3 (t3 > t2) сессия 1 делает commit. Так вот вопрос: а что получит сессия 2 в момент t2 в архитектуре EJB3? 123, 456 или сообщение о том, что запись X заблокирована? Получит примерно тоже что и в архитектуре 2.X . Синхронизация и взаимодействие конкурирющих транзакций определяются базой данных с которой работает ejb контейнер. Хотя деплоер и может выбрать при диплойменте режим блокировки optimistic/pessimistic, все возможные коллизии разрешаются на этапе коммита транзакции. Что касается вопроса: -в случае optimistic сессия 2 получит 123, -в случае pessimistic - сессия перейдет в режим ожидания снятия эксклюзивной блокировки сессии 1 на запись Х. В случае Оракла, select for update используется как способ создать эксклюзивной блокировку. PS это справедливо для уровней изоляции >= READ_COMMITED Вот этот момент с блокировкой и непонятен. Вторая сессия, как уже было подчеркнуто, только читает заблокированную запись. Если, в соответствии с описанным выше, EJB использует для управления изоляцией механизм базы данных, то в случае READ COMMITTED база сама найдет старую версию записи до того, как сессия 1 ее исправила и сессия 2 получит "старое" значение 123. В любом случае - заблокирована запись или нет для базы роли не играет (Oracle, например, хранит старые версии записей в undo и для него это не проблема). Так что если EJB не имеет собственного механизма управления изоляцией, то мы получим 123. Но есть сильные сомнения. Я не большой специалист в EJB, но из того что читал (сам ничего не тестировал!) складывается впечатление, что EJB сама управляет изоляцией и если сессия 1 изменила запись, но не зафиксировала ее с помощью commit, то сессия 2 не сможет прочитать запись и будет ждать, пока сессия 1 освободит запись. Такое впечатление было от обычного EJB, поэтому встал вопрос а в EJB3 это тоже так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 12:34 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
NN-123 ... складывается впечатление, что EJB сама управляет изоляцией и если сессия 1 изменила запись, но не зафиксировала ее с помощью commit, то сессия 2 не сможет прочитать запись и будет ждать, пока сессия 1 освободит запись. Такое впечатление было от обычного EJB, поэтому встал вопрос а в EJB3 это тоже так? Уровень изоляции - это абстракция, которая описывается теми или иными типами блокировок. Поэтому я бы не стал говорить, что уровень изоляции управляет доступом к записи со стороны конкурирующих транзакций. То что реально управляет доступом - так это блокировка, в этом плане спека на ejb предлагает две стратегии. Подход в управления доступом для конкурирующих транзакций для EJB3 от EJB2 ничем не отличается, принцип тот же самый, проверить легко, задаунлоадив спеку. Или вы говоря про обычные EJB, имели ввиду версию 1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 14:38 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
deepsky NN-123 ... складывается впечатление, что EJB сама управляет изоляцией и если сессия 1 изменила запись, но не зафиксировала ее с помощью commit, то сессия 2 не сможет прочитать запись и будет ждать, пока сессия 1 освободит запись. Такое впечатление было от обычного EJB, поэтому встал вопрос а в EJB3 это тоже так? Уровень изоляции - это абстракция, которая описывается теми или иными типами блокировок. Поэтому я бы не стал говорить, что уровень изоляции управляет доступом к записи со стороны конкурирующих транзакций. То что реально управляет доступом - так это блокировка, в этом плане спека на ejb предлагает две стратегии. Подход в управления доступом для конкурирующих транзакций для EJB3 от EJB2 ничем не отличается, принцип тот же самый, проверить легко, задаунлоадив спеку. Или вы говоря про обычные EJB, имели ввиду версию 1? Так как в EJB я не силен (в отличие от управлениея транзакциями в базе ), то насчет версий не скажу. Читал статью (под рукой нет), где приводился пример поведения подобному описанному Вами. Т.е. в случае entity beans изменение объекта якобы ведет к тому, что другая сессия будет ждать, когда объект освободится, даже если другая сессия просто хочет прочитать значение в поле этого объекта. Хотелось понять правда это или нет. Что касается изоляции, то к блокировкам она отношения не имеет. Запись может не иметь никакой блокировки и все равно механизм изоляции будет вынужден считать старую копию записи (READ CONSISTENCY). Это тот случай, когда наш SELECT очень долго работает и наталкивается на запись, которая была изменена другой транзакций, пока наш SELECT работал. Уровни изоляции определяют что получит операций чтения, если она встретит измененную запись. Блокировки тут не причем. Вторая сессия могла уже сделать commit и освободить запись. EJB предлагает 2 модели блокировок для предотвращения перезаписи одной записи несколькими сессиями. Это т.н. оптимистическая (в конце) и пессимистическая (в начале) блокировки. К уровням изоляции они отношения не имеют. Или речь о каких-то других блокировках? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 18:07 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
Т.е. в случае entity beans изменение объекта якобы ведет к тому, что другая сессия будет ждать, когда объект освободится, даже если другая сессия просто хочет прочитать значение в поле этого объекта. Я думаю что такое поведение все таки vendor specific... Но для EJB3 и Hibernate как средство ORM это утверждение не верно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2005, 18:32 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
NN-123 Что касается изоляции, то к блокировкам она отношения не имеет. Запись может не иметь никакой блокировки и все равно механизм изоляции будет вынужден считать старую копию записи (READ CONSISTENCY). Это тот случай, когда наш SELECT очень долго работает и наталкивается на запись, которая была изменена другой транзакций, пока наш SELECT работал. Уровни изоляции определяют что получит операций чтения, если она встретит измененную запись. Блокировки тут не причем. Вторая сессия могла уже сделать commit и освободить запись. Позволю себе с вами не согласиться, да в ANSI SQL92 блокировки не упоминаются, речь идет только об уровнях изоляции. Уровень изоляции позволяет не вдаваясь в детали реализации описать взаимовлияние параллельных транзакций друг на друга. Но если говорить о способах реализации изолированности транзакций - в этом случае есть два подхода управления конкурирующими транзакциями: блокировки или временные/версионные метки. Но я наверно не сильно ошибусь, если скажу никакая база данных не придерживается строго одного подхода, тот же Оракл используют и версионный подход и блокировки. Поэтому изоляция имеет отношении к блокировкам. NN-123 EJB предлагает 2 модели блокировок для предотвращения перезаписи одной записи несколькими сессиями. Это т.н. оптимистическая (в конце) и пессимистическая (в начале) блокировки. К уровням изоляции они отношения не имеют. Или речь о каких-то других блокировках? Речь идет именно о них, и они тоже имеют отношения к уровням изоляции базы данных, особенно пессимистическая - поскольку в этом случае именно база данных синхронизирует выполнение параллельных транзакций, и конечно уровень изоляции, а если глубже копнуть, то и способ реализации изолированности - блокировки влияют на их выполнение. Выполняется это при вызове методов ejbLoad, ejbCreate, ejbStore - пункт 9.1.12 для спеки на EJB3. С оптимистичными блокировка - все сложнее и разнообразнее, здесь многое зависит от апп сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 11:27 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
deepsky NN-123 EJB предлагает 2 модели блокировок для предотвращения перезаписи одной записи несколькими сессиями. Это т.н. оптимистическая (в конце) и пессимистическая (в начале) блокировки. К уровням изоляции они отношения не имеют. Или речь о каких-то других блокировках? Речь идет именно о них, и они тоже имеют отношения к уровням изоляции базы данных, особенно пессимистическая - поскольку в этом случае именно база данных синхронизирует выполнение параллельных транзакций, и конечно уровень изоляции, а если глубже копнуть, то и способ реализации изолированности - блокировки влияют на их выполнение. Выполняется это при вызове методов ejbLoad, ejbCreate, ejbStore - пункт 9.1.12 для спеки на EJB3. С оптимистичными блокировка - все сложнее и разнообразнее, здесь многое зависит от апп сервера. наличие или отсутствие пессимистической блокировки НИКАК не влияет на работу механизма изоляции. Пессимистическая блокировка это не что иное как выдача SELECT FOR UPDATE. Запись блокируется во время SELECT и остается заблокированной до окончания транзакции. Никакой изоляции делать не надо, поскольку изменения нет. Изоляция начинается с того момента, когда сессия выдала UPDATE, DELETE, INSERT. В этот момент база данных должна где-то сохранить старую копию этой записи и тем самым обеспечить изоляцию. Oracle сохраняет старую запись в UNDO сегменте. Если какая-то другая транзакция сделает SELECT до окончания первой, то она получит старую версию записи из UNDO. Влияние на изоляцию оказывают только операции изменения, но никак ни SELECT. Есть у него FOR UPDATE или нет - это только SELECT, который ничего не меняет в записи базы данных. P.S. Гуру Oracle скажут, что SELECT FOR UPDATE меняет запись и в UNDO при этом что-то попадет. Попадет. Признак блокировки записи, точнее неблокировки, т.к. старый вариант не был заблокирован. Но никакие "клиентские" данные не будут записаны в UNDO и параллельная транзакция будет брать значения в самой записи, а не в UNDO. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 18:06 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
NN-123 У вас какая-то странная терминология. Что значит Влияние на изоляцию оказывают только операции изменения, но никак ни SELECT. Есть у него FOR UPDATE или нет - это только SELECT, который ничего не меняет в записи базы данных. Если вы про уровень изоляции, то он является атрибутом транзакции и на него ничего влияния не оказывает кроме команды по его изменению. Далее, for update это вообще всего лишь средство борьбы с deadlock'ами и к виду клиентской стратегии организации транзакций прямого отношения не имеет Еще я не понял что значит Никакой изоляции делать не надо, поскольку изменения нет. Как можно делать изоляцию? Вы имеет стартовать транзакцию? Если да, то вы не правы, так как для уровней изоляции >read commited транзакция начнется и после select'а... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 18:41 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
funikovyuri NN-123 Далее, for update это вообще всего лишь средство борьбы с deadlock'ами и к виду клиентской стратегии организации транзакций прямого отношения не имеет for update это один из способов нарваться на deadlock. Чем больше for update, тем больше вероятность получить deadlock. Причина deadlock - эскалация блокировок. Если к обычным блокировкам, связанным с изменениями данных (и которых избежать невозможно), добавляются еще блокировки в момент SELECT (рукотворные блокировки, созданные по инициативе программиста), то общее число блокировок в базе возрастает. Это называется эскалация блокировок. Следствием этого может быть получение deadlock. Чем меньше блокировок, тем меньше вероятность deadlock. Доказательств приводить не буду - откройте любую книжку где описано управление транзакциями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2005, 16:25 |
|
||
|
Нормальная ли практика использования вместо тригеров EJB?
|
|||
|---|---|---|---|
|
#18+
NN-123 Доказательств приводить не буду - откройте любую книжку где описано управление транзакциями. Еще бы - ведь если вы тоже откроете "любую" книжку - то поймете, что доказать такое нельзя... В общем, отсылать меня к литературе по управлению транзакциями - это вы поторопились for update это один из способов нарваться на deadlock. Чем больше for update, тем больше вероятность получить deadlock. Еще в 1980 году создатели IBM System R впервые описали, а создатели DB2 применили так называемую U-блокировку. Эта блокировка совместима с S-блокировками, но не с другими U или, тем более, X-блокировками. Их исследования показали, что введение такой блокировки позволяет устранить 97% ситуаций приводящих к возникновению взаимной блокировки (deadlock). Причина deadlock - эскалация блокировок. Эскалация блокировок это не причина deadlock, а процесс повышения гранулярности блокировки, например, с записи до страницы и со страницы до таблицы. Эскалация блокировок - механизм повышения производительности СУБД и снижения накладных расходов на поддержание большого количества блокировок более низкой гранулярности. Объясняя на пальцах, работает таким образом: при достижении транзакцией большого количества блокировок строк внутри одной страницы сервер принимает решение о блокировании всей страницы, тем самым с одной стороны освобождая ресурсы, занимаемые большим количеством блокировок записей, с другой блокируя более крупный объект (страницу)... Если к обычным блокировкам, связанным с изменениями данных (и которых избежать невозможно), добавляются еще блокировки в момент SELECT (рукотворные блокировки, созданные по инициативе программиста), то общее число блокировок в базе возрастает. Как я уже писал, при использовании for update сервер будет прибегать к U-блокировке там, где в противном случае он бы использовал S. Так что никакого увеличения количества блокировок не произойдет, а только измениться их вид. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2005, 16:50 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2151767]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 324ms |

| 0 / 0 |
