#java
#java
Вопрос:
Запуск приложения J2EE на JBoss 5.1 с использованием режима гибернации. Мне нужно вызвать некоторые методы (в планировщике quartz), которые используют явные подключения к базе данных из корпоративного компонента. В настоящее время выдается сообщение об ошибке о том, что вызов commit не разрешен в транзакции.
Я надеялся, что добавление @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
аннотации к методу bean позволит мне вызвать quartz api, но все равно получит то же исключение. Я неправильно понимаю, что означает эта аннотация, или происходит что-то еще?
2014-06-23 17:43:41,184 ERROR [http-0.0.0.0-8443-4] org.quartz.JobPersistenceException: Couldn't commit jdbc connection. You cannot commit during a managed transaction! [See nested exception: java.sql.SQLException: You cannot commit during a managed transaction!]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.commitConnection(JobStoreSupport.java:3661)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3799)
at org.quartz.impl.jdbcjobstore.JobStoreTX.executeInLock(JobStoreTX.java:93)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeWithoutLock(JobStoreSupport.java:3703)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.checkExists(JobStoreSupport.java:1897)
at org.quartz.core.QuartzScheduler.checkExists(QuartzScheduler.java:1491)
at org.quartz.impl.StdScheduler.checkExists(StdScheduler.java:555)
Еще несколько данных:
1) Если я вызываю свой управляемый метод bean из неуправляемого класса без аннотации, то я получаю то же исключение (транзакция создается)
2) Если я вызываю свой управляемый метод bean из неуправляемого класса с аннотацией, то я не получаю исключение (транзакция не создана)
3) Если я вызываю свой метод управляемого компонента из другого управляемого компонента или из самого себя, то я получаю исключение с аннотацией или без нее (транзакция существует)
Таким образом, аннотация, похоже, предотвращает создание новой транзакции, но, похоже, она не приостанавливает уже существующую транзакцию (или, может быть, я все неправильно понимаю).
Комментарии:
1. Аннотация предназначена для транзакций, управляемых контейнером. Транзакции, управляемые контейнером, не могут быть разграничены (зафиксированы / откатаны) компонентом.
2. Не уверен, что вы говорите. Я хочу, чтобы контейнер приостановил транзакцию для этого метода, вот и все.
3. В настоящее время выдается сообщение об ошибке о том, что вызов commit не разрешен в транзакции. Вы получаете исключение при совершении транзакции. Использование
@TransactionAttribute
означает, что вы используете CMT (транзакция, управляемая контейнером). Проблема в том, что когда вы используете CMT, контейнер зафиксирует транзакцию, и вам не разрешено ее фиксировать.4. Пожалуйста, прочтите это — docs.oracle.com/javaee/5/tutorial/doc/bncij.html , и получить некоторое понимание.
5. Но разве в аннотации не указано, что контейнер должен приостановить транзакцию этим методом?