我正在使用Spring JDBC进行注释驱动的事务管理。
我想让Spring抛出一个异常,因为我错误地用@Transactional注释了一个插入/更新/删除的服务方法。
默认情况下,即使不在交易中,也可以插入/更新/删除数据。
答案 0 :(得分:1)
您可以在DAO图层中使用Propagation.MANDATORY
。
Propagation.MANDATORY
不会启动交易。它将检查特定方法是否附加到事务,如果不是容器将抛出异常。
答案 1 :(得分:0)
根据文档(Spring docs),它只是元数据,表明方法或接口可以由“事务感知”的东西配置(即
只有tx:注释驱动且没有@Transactional属性我相信你会应用“默认”事务性:
传播设置是必需的。 隔离级别为DEFAULT。 事务是读/写。 事务超时默认为基础事务系统的默认超时,如果不支持超时,则为none。 ny RuntimeException触发回滚,任何已检查的Exception都不会。 假设您正在使用tx:annotation通过事务管理器驱动它,那么错过@Transactional属性意味着您不能应用诸如readOnly,isolation,propagation,rollbackFor,noRollbackFor等属性。
我认为MVC略有不同 - hibernate会话直接与MVC请求绑定 - 即当收到请求时,事务开始。
回到你的例子,HibernateDAOSupport中getSession()的代码如下:
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException
{
return getSession(this.hibernateTemplate.isAllowCreate());
}
反过来要求:
/ ** *从当前事务或获取Hibernate会话 *一个新的。只有“allowCreate”为真时才允许后者。 * .......
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException {
return getSession(this.hibernateTemplate.isAllowCreate());
}
最终要求:
/ ** * .... * @param allowCreate是否应创建非事务性会话 *当没有找到当前线程的事务会话时 * .... * /
private static Session doGetSession(
SessionFactory sessionFactory, Interceptor entityInterceptor,
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate)
从根本上说,交易:会话以1:1的比例结束,没有交易的唯一方法是使用JBoss,它有一个'烘焙'持久层,为您提供交易(在封面下) 。即使你在getSession()之后调用getQuery(),你仍然会有一个事务,因为它是一个JDBC / Hibernate连接。