|
|
|
Нормальная ли практика использования вместо тригеров 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?fid=59&msg=33198535&tid=2151767]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 216ms |
| total: | 356ms |

| 0 / 0 |
