powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
11 сообщений из 11, страница 1 из 1
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38687832
Zufar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
	Пользователь 1			| 	Пользователь 2
==========================================================================
1)	Open ТРАНЗАКЦИЯ-1		|	----
	ТРАНЗАКЦИЯ-1 – Query Data=X	|	
--------------------------------------------------------------------------------------
					|	Open ТРАНЗАКЦИЯ-2
2)		----			|	ТРАНЗАКЦИЯ-2 – Query Data=X
--------------------------------------------------------------------------------------
3)	ТРАНЗАКЦИЯ-1 – Update Data=X+1	|	
	And Commit			|	-----
	Close ТРАНЗАКЦИЯ-1		|	
--------------------------------------------------------------------------------------
4)		----			|	ТРАНЗАКЦИЯ-2 – Update Data=X+1
					|	And Commit 
					|	Close ТРАНЗАКЦИЯ-2




На 4) шаге должен выйти Exception, и ТРАНЗАКЦИЯ-2 должна откатиться так как ТРАНЗАКЦИЯ-1 уже поменяла значение X на X+1, тогда как ТРАНЗАКЦИЯ-2 уже работает с устаревшими данными.



Данная задача реализована ниже, с использованием Оптимистической блокировки и @Version (в Entity поле Integer mgr ), где транзакция контролируется BMT (bean-managed transaction) и ВСЯ транзакция ( Открывается Тр. –> Запрос –> Обновление данных -> Commit -> Закрывается Тр.) происходит в одном методе через javax.transaction.UserTransaction.


Вопросы :
1) Как Запрос данных, Обновление данных и Commit поместить в одну транзакцию, с использованием WEB, тогда как Запрос и обновление будут разделены в отдельных методах (или Bean-ах) ?
2) Может есть какое-то стандартное решение данной задачи ?
3) Какую технологию Web лучше использовать совместно с EJB, для более гибкого контроля транзакциями?




Листинг 1. EJB Session Bean
==============================================================================
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
@Stateless
@LocalBean
@TransactionManagement(TransactionManagementType.BEAN)
public class myBean implements myBeanLocal {

	@PersistenceContext(unitName="ModelDDL")
	private EntityManager emDDL;

	@Resource
	private UserTransaction ut;	
	public void incSal() throws NotSupportedException, SystemException, SQLException  {
		{
			// -- Открывается Тр.
			ut.begin();
			try {
				// -- Запрос данных
				Emp emp1 = emDDL.find(Emp.class, new BigDecimal(7369));

				// 5 sec timeout 
				.......
				// -- Обновление данных
				emp1.setSal(new Integer(emp1.getSal().intValue()+100));
				// -- commit 
				ut.commit();
				// Закрывается Тр.				

				} catch (OptimisticLockException e) {
				......	
				}

			}
			catch (Exception e){
			......
			}
		}
	} 

}


==============================================================================

Листинг 2. EJB Entity bean “Emp.java”
==============================================================================
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Entity
public class Emp implements Serializable {
    @Id
    @Column(nullable = false)
    private BigDecimal empno;
		..................
    @Version
    private Integer mgr;
    private Integer sal;
		..................



==============================================================================
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688115
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zufar Вопросы :
1) Как Запрос данных, Обновление данных и Commit поместить в одну транзакцию, с использованием WEB, тогда как Запрос и обновление будут разделены в отдельных методах (или Bean-ах) ?

=== почти никак, т.к. в веб парадигма другая (минимальное время транзакции, чтобы исключить\минимизировать блокировки)

2) Может есть какое-то стандартное решение данной задачи ?

=== лень искать ссылку - пересмотри постановку задачи

3) Какую технологию Web лучше использовать совместно с EJB, для более гибкого контроля транзакциями?

=== есть распределённые транзакции, но это дорого и оверхед

Сколько времени между работой1 и работой 3? Т.к. тебе нужны длинные транзакции, что в вебе не приветствуется.

ЗЫ.
Что будем делать, если вечером будет Job который всем товарам делает наценку.
Zufar
Код: plaintext
ТРАНЗАКЦИЯ-X – UPDATE НоваяЦена ГруппаТоваров=33

??
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688492
Zufar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Время между работой1 и работой3, 1 - 3 минуты.
Появилась идея, Возможно ли связать сессию EJB Stateful bean-а (добавив к нему как @Resource UserTransaction) с HttpSession ?
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688497
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZufarВремя между работой1 и работой3, 1 - 3 минуты.офигеть
- перечитай все переменные заново, перед тем как updat'тить их
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688500
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZufarВозможно ли связать сессию
связать и написать можно что угодно.
Нужна Цель сей писанины.
Например, какой ВИ ваших 2-х пользователей при редактировании одной СУЩНОСТИ одновременно.
Т.е. какой тип приложения и транзакционной стратегии вы пишите.
http://www.k-press.ru/cs/2009/1/ts/ts.asp
авторТранзакции на платформе Java весьма дороги. В зависимости от используемой СУБД, они могут вызывать блокировки в БД, занимать ресурсы, замедлять работу приложения и даже, в некоторых случаях, приводить к взаимоблокировкам

Транзакционная стратегия, управляемая клиентом (Client Orchestration).
Транзакционная стратегия API Layer.
Транзакционная стратегия высокого параллелизма.
Транзакционная стратегия высокоскоростной обработки.
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688511
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zufar,
один из вариантов БЛ по транзакциям
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
public void processTrade(TradeData trade) throws Exception 
{
   UserTransaction txn = null;
   try 
   {
      // Сначала проверяем сделку
      TraderData trader = service.getTrader(trade.getTraderID());
      validateTraderEntitlements(trade, trader);
      verifyTraderLimits(trade, trader);
      performPreTradeCompliance(trade, trader);

      // Теперь изменяем счет
      AcctData acct = service.getAcct(trade.getAcctId());
      verifyFundsAvailability(acct, trade);
      adjustBalance(acct, trade);
      performPostTradeCompliance(trade, trader);

      // Начало транзакции и выполнение изменений
      txn = (UserTransaction)ctx.lookup("UserTransaction");
      txn.begin();
      service.insertTrade(trade);
      service.updateAcct(trade);
      txn.commit();
   } 
   catch (Exception up) 
   {
      if (txn != null) 
      {
         try 
         {
            txn.rollback();
         } 
         catch (Exception t) 
         {
            throw up;
         }
      }
      throw up;
   }
}

...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688568
Zufar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123ZufarВремя между работой1 и работой3, 1 - 3 минуты.офигеть
- перечитай все переменные заново, перед тем как updat'тить их

Попробую именно так, только при втором считывании буду брать поле @Version и сравнивать со значением первого считывания. А значение первого считывания передам в качестве параметра через HttpSession.
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688606
Zufar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос закрыт положительным результатом :-)
Через повторный запрос и сравнением версии этих двух запросов.
Petro123, Спасибо за помощь.
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688668
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zufar,

вообще такое делается через select...for update в шаге номер один.

но как это сделать в JPA я честно говоря не знаю. там наверняка можно только поднять уровень изоляции транзакции.
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688686
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zufar,

вообще такое делается через select...for update в шаге номер один.

но как это сделать в JPA я честно говоря не знаю. там наверняка можно только поднять уровень изоляции транзакции.
...
Рейтинг: 0 / 0
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
    #38688731
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zufar,

Можно положить сылку на stateful bean в сессию. Таким образом у каждого пользователя будет свой бин
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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