나는 위의 EJB했습니다 :EJB 트랜잭션 롤백하지
@Stateless
public class ItilEJB {
@PersistenceContext
protected EntityManager em;
public <T> T find(Class<T> clazz, Long id) {
if (clazz == null || id == null) {
return null;
}
return em.find(clazz, id);
}
public Chamado atender(Long chamadoId) {
Chamado chamado = find(Chamado.class, chamadoId);
if (!isChamadoAtendido(chamadoId)) {
Status emAndamento = new Status(Status.EM_ANDAMENTO);
HistoricoChamado historico = new HistoricoChamado();
historico.setDescricao("Início do atendimento do chamado.");
historico.setChamado(chamado);
historico.setStatus(emAndamento);
historico.setSla(chamado.getSla());
chamado.setStatus(emAndamento);
save(historico);
save(chamado);
}
return chamado;
}
public void save(BaseEntity entity) {
if (entity.getId() == null) {
if (!helper.canInsert(this, entity)) {
throw new AlertMessageRuntimeException("user.db.constraint");
}
em.persist(entity);
} else {
if (!helper.canUpdate(this, entity)) {
throw new AlertMessageRuntimeException("user.db.constraint");
}
em.merge(entity);
}
}
}
만약 내 두 번째 (chamado) 저장, 저장; 하나의 Exception (Runtime 또는 Not Both) 첫 번째 저장이 롤백되지 않는 이유를 이해할 수 없습니다. 나를 위해, 모든 EJB 호출은 하나의 트랜잭션에서 캡슐화 될 것이며 예외가 발생하면 DB 계층과의 전체 상호 작용이 롤백됩니다.
이 동작을 어떻게 수행합니까? 두 번째 저장에서 오류가 발생하면 첫 번째 저장 작업을 롤백해야합니다. 내가 DBMS 및 Application Server와 제이보스 8.1로 MySQL을 사용하고
감사
. 기본값을 변경하지 않았으므로 자동 커밋 모드가 활성화되어 있다고 생각하지 않습니다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="primary">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/MySQLDS</jta-data-source>
<properties>
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
이 standalone.xml
<datasource jndi-name="java:jboss/datasources/MySQLDS" enabled="${mysql.enabled}" use-java-context="true" pool-name="MySQLDS" use-ccm="true">
<connection-url>jdbc:mysql://${env.OPENSHIFT_MYSQL_DB_HOST}:${env.OPENSHIFT_MYSQL_DB_PORT}/${env.OPENSHIFT_APP_NAME}</connection-url>
<driver>mysql</driver>
<security>
<user-name>${env.OPENSHIFT_MYSQL_DB_USERNAME}</user-name>
<password>${env.OPENSHIFT_MYSQL_DB_PASSWORD}</password>
</security>
<validation>
<check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
<background-validation>true</background-validation>
<background-validation-millis>60000</background-validation-millis>
<!--<validate-on-match>true</validate-on-match>-->
</validation>
<pool>
<flush-strategy>IdleConnections</flush-strategy>
</pool>
</datasource>
롤백해야합니다. 어떤 DBMS를 사용하고 있습니까? 그리고 지속성 장치는 어떻게 구성되어 있습니까? 실패해야만하는 유일한 이유는 활성화 된 자동 커밋 모드가있는 경우입니다. – Gimby
우연히 배포 디스크립터가 있습니까? 설명자의 저장 메서드에 대해 TransactionAttribute를 재정의 할 수 있습니까? – jjd