不在事务中时回滚Spring JDBC操作

时间:2014-10-30 10:31:45

标签: java spring spring-jdbc spring-transactions

我正在使用Spring JDBC进行注释驱动的事务管理。

我想让Spring抛出一个异常,因为我错误地用@Transactional注释了一个插入/更新/删除的服务方法。

默认情况下,即使不在交易中,也可以插入/更新/删除数据。

2 个答案:

答案 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连接。