【问题标题】:spring transaction not working?春季交易不起作用?
【发布时间】:2014-05-28 11:56:41
【问题描述】:

您好,我正在尝试使用事务开发 spring 和 hibernate 应用程序,我正在使用 spring 4.x 和 hibernate 4.x,这是我的代码 sn-p

applicationContext.xml

<tx:annotation-driven />
     <context:annotation-config />

     <context:component-scan base-package="com.xyx.service" />
     <context:component-scan base-package="com.xyz.dao" />


    <import resource="conf/spring/persistence.xml" />

servlet-context.xml

<context:component-scan base-package="com.xyx.webservice.components" />
     <mvc:annotation-driven />
 <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    </bean>  

    <!--      Configure to plugin JSON as request and response in method handler -->
  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jsonMessageConverter"/>
            </list>
        </property>
    </bean> 

persistance.xml

<bean id="dataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver" />
            <property name="url" value="jdbc:mysql://localhost:3306/xyx" />
            <property name="username" value="root" />
            <property name="password" value="root" />
      </bean>

    <bean id="sessionFactory"           class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
        <property name="packagesToScan" value="com.xyz.model" />       
        <property name="hibernateProperties">
            <props>

                  <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                  <prop key="hibernate.show_sql">true</prop>           
                  <prop key="hibernate.cache.use_second_level_cache">false</prop>    
            </props>
        </property>

    </bean>

    <bean id = "transactionManager" class = "org.springframework.orm.hibernate4.HibernateTransactionManager"   p:sessionFactory-ref= "sessionFactory" > 
   </bean>



    </beans>

最后我的服务看起来像这样

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
    public Object loadCategories(UserContactsInputVO inputVo) {

        User user= getUserObject(inputVo);


        userDAO.saveOrUpdateForTrancasction(user);
        System.out.println(user.getUserId());

        //getAudioFilesBasedOnCategories();
        try{
            return getAudioFilesBasedOnCategories();
        }catch (RuntimeException e) {
            e.printStackTrace();
        }
        return new CategoryResponseVo();
    }

@Transactional(propagation=Propagation.REQUIRED)
    public CategoryResponseVo  getAudioFilesBasedOnCategories()
    {

        try{
            if(true)
        throw new RuntimeException();

        }finally{

        }
        return vo;

    }

此处发生运行时异常,但数据库记录未回滚。

【问题讨论】:

    标签: java spring hibernate spring-mvc


    【解决方案1】:

    事务没有回滚的原因是因为 RuntimeException 没有传播到管理事务回滚代码的实际 Spring 代理。而它没有被传播的原因是你已经抓住了它并且没有重新抛出。

    try{
                return getAudioFilesBasedOnCategories();
            }catch (RuntimeException e) {
                e.printStackTrace(); //**THIS IS WRONG**
            }
    

    改为这样做

     try{
                    return getAudioFilesBasedOnCategories();
                }catch (RuntimeException e) {
                    //log the error
                      throw e; // throw back
                }
    

    此外,您可能不需要在 RuntimeException 上提供 rollbackFor 属性,因为默认情况下,事务会回滚。

    【讨论】:

    • @Transactional(propagation=Propagation.REQUIRED) public CategoryResponseVo getAudioFilesBasedOnCategories() 上述方法的@transaction需要什么? ...据我所知,如果发生任何异常,它会继续当前事务,它已确认当前事务
    • 这与异常情况下的事务行为无关。它只是告诉事务管理器调用此方法需要一个正在运行的事务。如果已经有一个事务在进行,那么这个方法调用只是在同一个事务中被调用,否则一个新的事务被启动。这样做通常是为了保证此方法的调用即使在没有服务层的情况下也能在事务下运行。看看stackoverflow.com/questions/10740021/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多