Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.? / 11 сообщений из 11, страница 1 из 1
04.07.2014, 12:36
    #38687832
Zufar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
Код: 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
04.07.2014, 15:52
    #38688115
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
Zufar Вопросы :
1) Как Запрос данных, Обновление данных и Commit поместить в одну транзакцию, с использованием WEB, тогда как Запрос и обновление будут разделены в отдельных методах (или Bean-ах) ?

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

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

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

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

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

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

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

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

Транзакционная стратегия, управляемая клиентом (Client Orchestration).
Транзакционная стратегия API Layer.
Транзакционная стратегия высокого параллелизма.
Транзакционная стратегия высокоскоростной обработки.
...
Рейтинг: 0 / 0
04.07.2014, 23:50
    #38688511
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
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
05.07.2014, 11:26
    #38688568
Zufar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранить(сберечь) транзакцию БД при взаимдествии EJB Session Bean-a c WebClient-ом.?
Petro123ZufarВремя между работой1 и работой3, 1 - 3 минуты.офигеть
- перечитай все переменные заново, перед тем как updat'тить их

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

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

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

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

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

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


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