我正在使用Spring JDBC的注解驱动事务管理。
当我不小心忘记在插入/更新/删除服务方法上注释@Transactional时,我希望Spring抛出异常。
默认情况下,即使不在事务中,也可以插入/更新/删除数据。
我正在使用Spring JDBC的注解驱动事务管理。
当我不小心忘记在插入/更新/删除服务方法上注释@Transactional时,我希望Spring抛出异常。
默认情况下,即使不在事务中,也可以插入/更新/删除数据。
Propagation.MANDATORY
。
Propagation.MANDATORY
不会启动一个事务。它将检查特定方法是否附加到事务中,如果没有,容器将抛出异常。protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException
{
return getSession(this.hibernateTemplate.isAllowCreate());
}
这反过来调用:
/** * 获取一个Hibernate Session,可以从当前事务或新事务中获取。只有在“allowCreate”为true时才允许后者。 *.......
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException {
return getSession(this.hibernateTemplate.isAllowCreate());
}
最终调用:
/** * .... * @param allowCreate 当前线程找不到事务性Session时,是否应该创建非事务性Session * .... */
private static Session doGetSession(
SessionFactory sessionFactory, Interceptor entityInterceptor,
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate)
从根本上讲,Transaction:Session 是一对一绑定的,而且如果我没记错的话,唯一无需事务运行的方法是使用内置持久化层提供事务处理的 JBoss(在后台)。即使在 getSession() 后调用 getQuery(),仍然会有效地发生事务,因为它是一个 JDBC/Hibernate 连接。
Propagation.MANDATORY
的回复都是正确的,但始终要考虑通过 JUnit 进行测试以确认任何预期的行为。 - Manuel Jordan