У меня есть потенциально длительная транзакция в JBoss-EAP 7.2.6, где мне нужно выполнить фиксацию в несколько шагов.
Я понимаю, что MariaDB не имеет вложенных, но связанных цепочек транзакций. Это мое представление о том, как это должно работать:
public class MyEntityManager implements IMyEntityManager {
@PersistenceContext(unitName = "org.x.y.z")
protected EntityManager em;
@Transactional(timeout = 900) // 15 minutes
public void doTransaction(MyEntity me) {
// Spring has a misfeature that @Transactional only applies when called from the outside.
// Calling through an external reference works around this shortcoming. :-(
MyEntityManager self = this;
self.persist(me);
publish(me.id); // Pseudocode, my read-only client eagerly waiting for id.
// Fill me with more data
self.flush();
// Fill me with more data
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
private void persist(MyEntity me) {
em.persist(me);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
private void flush() {
em.flush();
}
}
Я попытался перейти на NESTED
и обновить драйвер с 2.4.3 до 2.5.4 безрезультатно.
Как получить такой сценарий для работы с InnoDB? Я бы с готовностью выдал низкий уровень COMMIT AND CHAIN
сам, так как в @ Spring / Hibernate, похоже, не было API для этого.
Я пытался
em.createNativeQuery("COMMIT AND CHAIN").executeUpdate();
, но это приводит к
XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state
, в то время как
em.unwrap(Session.class).createSQLQuery("COMMIT AND CHAIN").executeUpdate();
ведет к
GenericJDBCException: could not execute statement