У меня есть Websphere Application Server 7.0.0.9
, на котором запущено приложение, которое использует springframework 2.0.9
и hibernate 3.3.0
(или 3.4.0, или оба, я не уверен). TransactionManager - org.springframework.transaction.jta.WebSphereUowTransactionManager
.
У меня есть метод, аннотированный как @org.springframework.transaction.annotation.Transactional
. Этот метод вызывает другой метод, который также аннотируется как @org.springframework.transaction.annotation.Transactional
:
@Transactional
public void myMethod() {
doSomeUpdates();
nestedMethod();
}
@Transactional
public void nestedMethod() {
doSomeMoreUpdates();
}
Метод "myMethod" должен быть атомарным. Иногда возникает ошибка при откате обновлений из «doSomeUpdates», но обновления из «doSomeMoreUpdates» фиксируются.
Настройки распространения по умолчанию: Propagation.REQUIRED
. Я попытался изменить свой код на:
@Transactional
public void myMethod() {
doSomeUpdates();
nestedMethod();
}
@Transactional(propagation = Propagation.MANDATORY)
public void nestedMethod() {
doSomeMoreUpdates();
}
Я попытался посмотреть в журналах, чтобы выяснить, решило ли это изменение мою ошибку, но у меня не получилось ни головы, ни хвоста болота, которым являются мои файлы журналов. Я регистрирую SQL-операторы с помощью класса org.hibernate.jdbc.util.SQLStatementLogger и выкидываю транзакционные мелочи в файл trace.log websphere со следующими настройками:
com.ibm.wsspi.uow.*=finest: com.ibm.ws.uow.*=finest:
com.ibm.ws.jtaextensions.*=finest: org.hibernate.transaction.*=finest:
org.springframework.transaction.*=finest: com.ibm.ws.Transaction.*=finest:
com.ibm.ws.LocalTransaction.*=finest: com.ibm.ws.tx.*=finest:
oracle.jdbc.*=finest:
Это приводит к кучам бесполезных данных, но операторы sql выгружаются только SQLStatementLogger, который, похоже, не имеет никакого отношения к транзакциям websphere. Как узнать, какие операторы sql действительно выполняются веб-сферой в каждой транзакции?