我正在使用Spring JDBC的批注驱动事务管理。当事务处于非事务中时回滚Spring JDBC操作
我想春天抛出一个异常,当我忘了用@Transactional注释一个插入/更新/删除的服务方法。
默认情况下,即使不在事务中,也可以插入/更新/删除数据。
我正在使用Spring JDBC的批注驱动事务管理。当事务处于非事务中时回滚Spring JDBC操作
我想春天抛出一个异常,当我忘了用@Transactional注释一个插入/更新/删除的服务方法。
默认情况下,即使不在事务中,也可以插入/更新/删除数据。
您可以在您的DAO图层中使用Propagation.MANDATORY
。
Propagation.MANDATORY
将不会启动交易。它将检查特定方法是否附加到事务中,如果不是容器将抛出异常。
根据文档(春季文档),它只是元数据,并进行指示的方法或接口可以通过一些配置,即是“事务意识”(即
只需TX:注释驱动和无@Transactional属性,我相信你会得到应用的“默认”事务性:
传播设置是必需的 隔离级别是DEFAULT 事务是读/写 事务超时默认为基础交易的默认超时。系统,或者如果超时不被支持则无。 ny RuntimeException触发回滚,并且任何检查的异常不会。 假设你正在使用的TX:注释通过事务管理器,以驱动它,然后缺失出@Transactional属性意味着不能为只读,隔离,传播,的rollbackFor,noRollbackFor等应用这种性质
我相信MVC稍有不同 - 休眠会话直接与MVC请求绑定 - 即收到请求时事务开始。
回到你的榜样,为的getSession()中的HibernateDaoSupport的代码如下:
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException
{
return getSession(this.hibernateTemplate.isAllowCreate());
}
这反过来又来电:
/** * 获得一个Hibernate的Session,无论是从目前的交易或 *一个新的。只有在“allowCreate”为真时才允许后者。 * .......
protected final Session getSession()
throws DataAccessResourceFailureException, IllegalStateException {
return getSession(this.hibernateTemplate.isAllowCreate());
}
最终调用:
/** * .... *参数allowCreate非事务性会议是否应创建 *当没有事务性会议,可以发现当前线程 * .... */
private static Session doGetSession(
SessionFactory sessionFactory, Interceptor entityInterceptor,
SQLExceptionTranslator jdbcExceptionTranslator, boolean allowCreate)
从根本上说,一个交易:会话绑1:1 AFA ik,而没有事务运行的唯一方法就是使用JBoss,它有一个“烘焙进去”持久层,为您提供事务性(在封面下)。即使你在getSession()之后调用getQuery(),你仍然有一个事务发生,因为它是一个JDBC/Hibernate连接。
您可以在您的DAO层使用Propagation.MANDATORY – 2014-10-30 10:43:15
选择仅在服务层使用@Transactional,因为事务总是从那里开始的。 – yannisf 2014-10-30 11:01:32
那么你可以通过反射遍历所有服务类,并检查它们是否都包含@Transactional注释 – 2014-11-02 17:12:22