2013-08-13 4 views
1

У нас возникают проблемы с блокировкой таблицы и взаимоблокировками в приложении EJB 3.0/JPA 1.0/DB2 10.1. Мы выяснили, что если простой запрос SELECT исключается в методе ejb, который поддерживает транзакцию, записи становятся заблокированными (следующая блокировка ключа - режим блокировки NS), что в конечном итоге приводит к потенциальным проблемам с взаимоблокировками. Если тот же запрос выполняется в ejb-методе без транзакции, блокировка не происходит, и я думаю, что так оно и должно быть.Ejb CMT Атрибут транзакции NotSupported не приостанавливает транзакцию клиента

Вопрос: У нас есть ejb ejbA с методомA, который требует транзакции. У нас есть ejbB с методом B, который имеет простой запрос выбора и не должен работать внутри транзакции, поэтому мы устанавливаем атрибут trnasaction для: NotSupported. Мы называем метод B из метода A.

Учебник Oracle EE6 гласит: если клиент работает в транзакции и вызывает метод корпоративного компонента, контейнер приостанавливает транзакцию клиента перед вызовом метода. По завершении метода контейнер возобновляет транзакцию клиента.

Как мы понимаем, метод B должен приостановить транзакцию из метода A и не должен блокировать запись, но это делает, что приводит меня к выводу, что транзакция не приостановлена.

Не могли бы вы помочь нам решить и понять поведение.

ответ

0

Как вы зовете: methodB?

Если вызывающий код выглядит следующим образом:

@Stateless 
public class MyEJB{ 

    @TransactionAttribute(REQUIRED) 
    public void methodA(){ 
     ... 
     methodB(); 
     ... 
    } 

    @TransactionAttribute(NOT_SUPPORTED) 
    public void methodB(){ 
     ... 
    } 
} 

сервер приложений никогда не будет знать, когда приостановить сделку (вызов метода не вызывается метод контейнера созданного прокси-сервера).

Чтобы правильно вызвать метод с другой транзакцией семантическим, вы должны получить доступ к дополненному объекту доступен на SessionContext как в:

@Stateless 
public class MyEJB{ 

    @Resource 
    SessionContext sc;   

    MyEJB self; 

    @PostConstruct 
    public void init(){ 
     this.self = this.sc.getBusinessObject(MyEJB.class); 
    } 

    @TransactionAttribute(REQUIRED) 
    public void methodA(){ 
     ... 
     self.methodB(); 
     ... 
    } 

    @TransactionAttribute(NOT_SUPPORTED) 
    public void methodB(){ 
     ... 
    } 
} 
+0

Спасибо за ответ. Мы вызываем ejbB.methodB из ejbA.methodA, разные ejb, поэтому это не должно быть проблемой. – Mitko

+0

Ну, в этом случае, возможно, нам нужен фактический код. Не могли бы вы обновить свой вопрос? –

Смежные вопросы