Я экспериментирую с транзакциями JTA и не могу понять, почему метод, который помечен для создания новой транзакции, не редактируется (код редактируется соответствующим образом). Это переделывает предыдущего вопроса, я спросил на тему (here):Почему новая транзакция JTA не создается?
@Stateless
public class StaffEntityOps
{
@Resource TransactionSynchronizationRegistry txReg;
private void transactionStatus(String where)
{
String msg;
int stat = txReg.getTransactionStatus();
switch (stat) {
case STATUS_ACTIVE:
msg = "Active";
break;
case STATUS_NO_TRANSACTION:
msg = "No Transaction";
break;
default:
msg = "Other: " + stat;
}
System.out.println("Transaction status in " + where + ": " + msg);
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void saveToEM(EntityManager em, StaffEntity staffEntity)
throws ...
{
transactionStatus("saveToEM: ");
em.persist(staffEntity);
em.flush();
}
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void add(StaffEntity staffEntity)
throws ...
{
// Entity Managers emDB1 and emDB2 are injected into class.
transactionStatus("add: ");
saveToEM(emDB1, staffEntity);
saveToEM(emDB2, staffEntity);
}
Идея выше, должен был вызвать метод add(StaffEntity staffEntity)
упорствовать новый StaffEntity
к набору не-XA DataSources , Я решил это с помощью транзакций, управляемых бинами (предыдущий вопрос, процитированный выше), а также с XA-DataSources. Мне все же хотелось бы определить, есть ли способ сделать это с помощью транзакций, управляемых контейнером, и источников данных, отличных от XA (в основном для понимания того, как аннотация @TransactionAttribute
влияет на вещи).
Попытка, описанная выше, пытается явно создать новую транзакцию для сохранения в каждой базе данных, изолировав ее по своему собственному методу и маркируя ее REQUIRES_NEW
. Это не работает. Сообщения sysout показывают, что в методах add
и saveToEM
есть «Нет транзакции».
Почему не создается новая транзакция для каждого вызова saveToEM
? Для меня имеет смысл, что метод add
имеет «No Transaction», потому что он помечен NOT_SUPPORTED
. Но не должно ли REQUIRES_NEW
на saveToEM
создавать новую транзакцию при каждом ее вызове? (Glassfish 4.0, EclipseLink 2.5)
Как вы получаете/устанавливаете экземпляр em? Вы пробовали пример JPA на Glassfish, например https://blogs.oracle.com/arungupta/entry/jpa_2_1_implementation_eclipselink? – Chris
Каждый экземпляр em имеет нечто вроде '@PersistenceContext (unitName =" jdbc/.. something .. ") EntityManager emdb1;' Я должен отметить, что использование JPA работает нормально - пока я не попытаюсь что-то сделать с более чем 1 источник данных. Как только я попытаюсь использовать оба одновременно, я получаю ошибку, отличную от XA (что я понимаю). Поэтому я пытаюсь отделить оставшиеся данные от разных источников данных в своих транзакциях, чтобы избежать использования источников данных XA. – CraftWeaver
Я верю, потому что saveToEM вызывается локально, контейнер не запускает транзакцию для вызова. Он рассматривается как метод Java. – Chris