当前位置: 首页 > 知识库问答 >
问题:

spring事务不工作?

尤祖鹤
2023-03-14

嗨,我正在尝试开发带有事务的spring和hibernate应用程序,我正在使用Spring4。x和hibernate 4。下面是我的代码片段

应用程序上下文。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上下文。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> 

坚持。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>

finnaly meservice看起来像这样

@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;

    }

这里会发生运行时异常,但db记录没有回滚。

共有1个答案

逑兴安
2023-03-14

事务没有回滚的原因是因为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
            }

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

 类似资料:
  • 我是一个新的Spring和学习的事务概念。无法使@Transactional工作。 用例: 当getEmployee()抛出RuntimeException时,员工和员工详细信息的数据插入应该回滚。但回滚没有发生。我使用的是Oracle数据库11g和spring 4.3.1版本。下面是正在运行的独立java代码。

  • 我使用的是grails 1.3.7,代码如下: Grails服务: 我的例外: } 当代码抛出MyException时,我发现以下错误:事务回滚,因为它已被标记为仅回滚 注:如果我更改static transactional=true,则不会发生错误。 知道吗?

  • 我将Spring 3.2.4与JavaFX结合使用,并希望实现一种方法,其中操作将在事务中执行。我在控制器中的代码如下所示: 以及我的应用程序上下文: 尝试运行时,我收到以下错误消息: 该方法存在。删除注释,或者将方法从public更改为private,或者从配置中删除bean,程序就会运行,但事务注释根本不起作用。删除代理目标会导致另一个错误。

  • 我试图通过在一个事务中运行多个save方法来原子化地保存许多实体,因此如果其中任何一个方法失败,所有这些方法都将被丢弃(回滚)。我尝试了很多方法,但似乎没有什么效果: BookingResource。java: ReservationRepository。java: Reservation.java: stacktrace是: 那么,这里发生了什么?我如何解决它?我试图公开这些方法,更改事务策略,

  • 问题出在@Transactional中,在我的配置中spring应用程序没有使用它。我怎么能修好它? ...REST控制器没有任何事务性方法,它只使用specifiedServices加载实体。依赖集合(如果未加载到服务中)应为空。 应用程序启动程序类: 我还尝试将@Transactional添加到存储库接口中,但对我来说并不起作用 所以我从存储库中删除了@Transactional,创建了其他服