Я экспериментирую с очень сложным поведением с CMT в JBoss6. 1+ обращается к zos/390 DB2.
Окружающая среда:
Транзакция просто не откатывается с SystemExceptions. Я пробовал BMT и с удивлением тоже не работает. Мой код BMT ниже:
@Stateless
@LocalBean
@TransactionManagement(TransactionManagementType.BEAN)
public class ManterPortabilidadeBean
implements PortabilidadeService {
@Inject
private UserTransaction tx;
@Override
public void incluirPortabilidade(...) {
try {
tx.begin();
//insert into database
daoPortabilidade.incluir(portabilidade);
if (1==1)
throw new EJBException("Bingo");
tx.commit();
} catch (Exception e) {
try {
tx.rollback();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
Ну, запись в базе !!! Невероятно !!! Контейнер EJB полностью игнорирует, ничего не делает.
Вот код CMT:
@Stateless
@LocalBean
@TransactionManagement(TransactionManagementType.CONTAINER)
public class ManterPortabilidadeBean
implements PortabilidadeService {
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void incluirPortabilidade(...) {
//insert into database
daoPortabilidade.incluir(portabilidade);
if (1==1)
throw new EJBException("Bingo");
}
}
Я считаю, что DB2 совершает автоматический запуск, например autocommit = true, но конфигурация сообщает, что autocommit является ложным, см. Persistence.xml ниже:
<persistence-unit name="gecDS" transaction-type="JTA">
<jta-data-source>java:/jdbc/DB2SigecDS</jta-data-source>
<properties>
<property name="hibernate.dialect"value="org.hibernate.dialect.DB2390Dialect" />
<property name="hibernate.default_schema" value="GEC" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.isolation" value="2" />
<property name="hibernate.connection.autocommit" value="false"/>
<property name="javax.persistence.jdbc.driver" value="com.ibm.db2.jcc.DB2Driver" />
</properties>
</persistence-unit>
Я standalone.xml У меня есть эта конфигурация для источника данных:
<datasource jta="false" jndi-name="java:/jdbc/DB2SigecDS" pool-name="jdbc/DB2SigecDS" enabled="true">
<connection-url>jdbc:db2://************</connection-url>
<driver-class>com.ibm.db2.jcc.DB2XADataSource</driver-class>
<driver>db2</driver>
<security>
<user-name>*******</user-name>
<password>*******</password>
</security>
</datasource>
Любая идея, конфигурация??? Спасибо
Я обнаружил странную проблему. Просто конфигурации !!!
В атрибуте datasource "jta" должно быть истинным (спасибо Aramburu), и я использую XADatasource:
<persistence-unit name="gecDS" transaction-type="JTA">
<jta-data-source>java:/jdbc/DB2SigecDS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2390Dialect" />
<property name="hibernate.default_schema" value="GEC" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.connection.isolation" value="2" />
<property name="hibernate.connection.autocommit" value="false"/>
<property name="javax.persistence.jdbc.driver" value="com.ibm.db2.jcc.DB2XADataSource" />
</properties>
</persistence-unit>
<datasource jta="true" jndi-name="java:/jdbc/DB2SigecDS" pool-name="jdbc/DB2SigecDS" enabled="true">
<connection-url>jdbc:db2:**************</connection-url>
<driver-class>com.ibm.db2.jcc.DB2XADataSource</driver-class>
<driver>db2</driver>
<security>
<user-name>???????</user-name>
<password>???????</password>
</security>
</datasource>
Друзья пользователя спасибо