Ответ 1
В соответствии с документацией (Spring docs) это просто метаданные, чтобы дать указание, что метод или интерфейс могут быть настроены чем-то то есть "транзакционно известно" (т.е. <tx:annotation-driven/>
).
С помощью только tx: привязанного к аннотациям и атрибута @Transactional
, я считаю, что вы применяете транзакцию по умолчанию:
- ТРЕБУЕТСЯ ПРОГРАММА РАЗМЕЩЕНИЯ.
- Уровень изоляции DEFAULT.
- Транзакция читается/записывается.
- Тайм-аут транзакции по умолчанию соответствует тайм-ауту по умолчанию для базовой транзакционной системы или никому, если тайм-ауты не поддерживаются.
- любое RuntimeException вызывает откат, и любое исключенное исключение не выполняет.
Предполагая, что вы используете <tx:annotation-driven />
, чтобы управлять им через диспетчер транзакций, а затем пропускать атрибут @Transactional
, значит вы не можете применять такие свойства, как readOnly, изоляция, распространение, rollbackFor, noRollbackFor и т.д.
Я считаю, что MVC немного отличается - сеанс Hibernate привязан непосредственно к запросу MVC, то есть когда запрос получен, транзакция начинается.
Вернемся к вашему примеру, код для getSession() в HibernateDAOSupport выглядит следующим образом:
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException
{
return getSession(this.hibernateTemplate.isAllowCreate());
}
Что в свою очередь вызывает:
/**
* Obtain a Hibernate Session, either from the current transaction or
* a new one. The latter is only allowed if "allowCreate" is true.
*.......
*/
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException {
return getSession(this.hibernateTemplate.isAllowCreate());
}
который в конечном итоге вызывает:
/**
* ....
* @param allowCreate whether a non-transactional Session should be created
* when no transactional Session can be found for the current thread
* ....
*/
private static Session doGetSession(
SessionFactory sessionFactory, Interceptor entityInterceptor,
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate)
В сущности, транзакция: сеанс привязан 1:1 AFAIK, и единственный способ запуска без транзакции - использовать JBoss, который имеет "запеченный" уровень сохранения, который обеспечивает транзакцию для вас (под обложками), Даже если вы вызываете getQuery()
после getSession()
, вы по-прежнему эффективно выполняете транзакцию, являющуюся соединением JDBC/Hibernate.