|
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
|
||||||
Транзакции в EJB22.12.2008, 09:52. Показов 6736. Ответов 33
Метки нет (Все метки)
есть такой вот кусок кода.
и действительно, транзакция почти полностью отменяется, т.е. поля productId & buildDate обнуляются (возвращаются в исходное состояние). проблема в том, что созданный build не удаляется при откате. а хотелось бы, чтобы откатилось ВСЕ - и созданный 'недоделанный' build был бы удален тоже. есть ли более элегантные решения, чем говорить вручную build.remove? (Product, Build - entity ejbs (CMP), сам код исполняется в session EJB)
0
|
||||||
| 22.12.2008, 09:52 | |
|
Ответы с готовыми решениями:
33
EJB: если в таблице БД задано каскадное удаление, то в ejb-jar.xml тоже надо его указывать? Microsofr VJ ++6 - EJB EJB и JPA |
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 12:12 | |
|
>почему откатывается часть изменений, связанная с выставлением полей нового объекта... почему он не удаляется?
Имеем дело с новым экземпляром CMP. Контейнер сам кеширует его состояние и восстанавливает его, если транзакция откатывается. До того, как бин создан, он не участвует в транзакции, у него нет состояние. Это значит, что процесс создания/удаления управлется не созданным CMP бином. То, что программист делает в Session для кеширования состояния и отката транзакций, контейнер в CMP автоматизирует. >я почему-то всю жизнь транзакции понимал так... Мы не про СУБД говорим.
0
|
|
|
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
|
|
| 22.12.2008, 12:48 [ТС] | |
|
во по поводу этого:
'Имея это в виду, можно реализовать SessionSynchronization.beforeCompletion( ) и там либо оставлять все, как есть, либо вручноую откатывать транзакцию -- читай, восстанавливать состоние (state) бина.' можно поподробнее? как это можно в моем случае использовать? (на всякий случай напомню - в моем Session bean - CM-transactions)
0
|
|
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 13:09 | |
|
>на всякий случай напомню - в моем Session bean - CM-transactions
Само собой, так как в BM-trans нельзя использовать setRollbackInly() :-) Интерфейс SessionSynchronization может реализовывать только Statefull Session beans with BM transaction. Класс реализации бина (реализующий javax.ejb.SessionBean) может реализовывать интерфейс SessionSynchronization. Если он его реализовывает, то контейнер вызывает объявленные в этом интерфейсе операции. Операция afterBegin() вызывается при открытии транзакции: после вызова клиентом операции бина и до вызова контейнером реализации вызванной клиентом операции. Операция beforeCompletion() вызывается непосредственно перед закрытием транзакции (как откатанной, так и подтвержденной): после возврата управления из метода бина контейнеру и перед возвратом управления контейнером клинту. Операция afterCompletion(boolean committed) вызывается после того как транзакция закрыта. Вызывается после вызова beforeCompletion() перед возвратом управления клиенту. В твоем случае скорее всего нужно использовать afterBegin() и beforeCompletion(). Можно придумать свой класс-состояние бина. После afterBegin() создать новый объект-состояние, и класть туда, например, созданный CMP. При вызове beforeCompletion() проверяем, помечена транзакция для отката или нет. Если да, то изменения, сделанные с состоянием (они хранятся в объекте-состоянии), откатываем.
0
|
|
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 13:10 | |
|
Описался. Интерфейс SessionSynchronization может реализовывать только Statefull Session beans with CM transaction.
0
|
|
|
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
|
||||||
| 22.12.2008, 13:27 [ТС] | ||||||
|
вот сейчас для интереса попробовал с bean-managed transactions.
указал, что мой session bean использует BM-transaction. поменял код соответственно:
0
|
||||||
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 13:37 | |
|
Естественно. С точки зрения созданного CMP и записи, ему соответсвующей, транзакция началась ПОСЛЕ того, как этот CMP создан. Поэтому, откатывая транзакцию, он восстанавливает состояние в такое, что было на начало транзакции. А с точки зрения CMP, повторюсь, транакция началась ПОСЛЕ его создания.
Созданный новый CMP -- изменение в состоянии Session бина, он и должен убить созданный CMP, откатывая транзакцию.
0
|
|
|
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
|
|
| 22.12.2008, 13:45 [ТС] | |
|
ммм... похоже, я чего-то главного не понимаю. вот эта фраза:
'Естественно. С точки зрения созданного CMP и записи, ему соответсвующей, транзакция началась ПОСЛЕ того, как этот CMP создан. ' я пишу: transaction.begin build=somehome.create() ... transaction.rollback как эта фраза соотносится с этим вот кодом? транзакция относится ведь не к понятию 'build', а ко всему методу. то есть я вот полагал, что и откатиться должны ВСЕ изменения в EJB,которые этот метод породил (ну и изменения через JDBC, если правильно получали datasource, конечно)
0
|
|
|
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
|
||||||
| 22.12.2008, 13:49 [ТС] | ||||||
|
и кстати, если я делаю так:
0
|
||||||
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 13:55 | |
|
Нажал esc, и браузер мою поэму съел. БЛИН.
Кажется, понял, где пробоина. Дело в том, что менеджер транзакций не занимается откатом или подтверждением транзакций. Он управляет контекстом транзакций: учитывает объекты, вовлеченные в транзакцию, уведомляет их, производит различные проверки и т. д. Откатом и подтверждением занимаются сами бины. В методе Session бина открывается транзакция, в которую вливается созданный CMP. Так как при откате транзакции менеджер транзакций уведомляет каждый объект, вовлеченный в транзакцию, то уведомляется и созданный CMP. Понятно или глубже писать?
0
|
|
|
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
|
|
| 22.12.2008, 13:58 [ТС] | |
|
ок, пусть уведомляется созданный бин. так как это entity bean ('build'), то у него CM-transaction. то есть он сам должен откатиться назад. так? тогда в чем проблема? почему он сам не удаляется?
давай глубже пиши
0
|
|
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 14:00 | |
|
В сессионных бинах нет доброго дяди, который все сам знает, как в СУБД или в CMP. В CMP есть этот добрый дядя, но он за пределы изменений в этом CMP не выходит. А если нет записи, нет и CMP. А нет CMP, нет дядя для этого CMP.
0
|
|
|
0 / 0 / 2
Регистрация: 24.08.2008
Сообщений: 119
|
|
| 22.12.2008, 14:06 [ТС] | |
|
так, ладно, допустим, это можно считать ответом на вопрос 'кто виноват', поставленный в начале топика, хотя я вот раньше немного по-другому схему transactions в EJB представлял. все может быть, наша группа EJB не занимается, так что это мои собственные исследования были.
теперь другой вопрос - что делать, собственно? пока пришлось сделать build.remove в блоке catch и все. но ведь это же порнография какая-то. получается, что во всех подобных методах, которых в классе SphereDataManager весьма много, надо следить, где чего создается, и вручную удалять? мдааааааа.... транзакции, панимаишь....
0
|
|
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 14:07 | |
|
До того, как бин не создан, нет и его состояния. Состояние появляется, когда создается бин (а он, как известно, создается вмместе с записью). Состояние можно сфотографировать только после того, как объект создан.
Ты создал бин, он влился в транзакцию, он же сфотографировал свое состояние. Откатывая транзакцию, он возмет и восстановит сфотографированное состояние. Что такм будет??? То, что было сразу непосредственно после создания и вливания в транзакцию. То есть бин уже был создан. Убить CMP -- задача не CMP -- твоя задача. Твой Session должен убить его. Термин. Состоние -- совокупность значений отрибутов объекта. Атрибут объекта -- читай его поле данных.
0
|
|
|
4 / 4 / 4
Регистрация: 28.08.2008
Сообщений: 611
|
|
| 22.12.2008, 14:09 | |
|
Паттерн состояние знаешь? Твой случай.
И используй beforeCompletion().
0
|
|
| 22.12.2008, 14:09 | |
|
Сортировка EJB Книги EJB Не собирается ejb EJB и WEB модули
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|