【问题标题】:Hibernate and Mysql, transaction autocommit just for a sectionHibernate和Mysql,事务自动提交只是为了一个部分
【发布时间】:2013-06-01 13:33:35
【问题描述】:

我需要拒绝一小部分方法的事务回滚,但我不知道该怎么做,因为在方法的其他部分我需要标准行为。

这是我的 Spring,Hibernate 配置:

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

并且我的类是用“@Transaction”注释声明的,以在出现异常时打开事务并回滚。 但是,我需要在对 db 进行重要插入后强制提交。如何做到这一点?

这是示例代码:

@Transactional
public void myMethod(Object obj){
   check.do();
   check.control();
   try{
      dao.insert(obj);
      fileWriter.write();
      printer.print();
   }catch(Exception e){
      log.error(e);
   }
}

我在 try 语句 (dao.insert) 中所做的事情必须在自动提交中,因为我不希望在插入回滚事务之后发生这种情况。在我的示例中,如果 printer.print() 失败,我不希望 dao.insert() 回滚。但是我只需要在此尝试中使用此行为。

谢谢

编辑

我还尝试远程 @Transactional 注释并仅为 dao.insert 创建一个私有事务方法,但是 tt 失败了其他组件内的所有延迟加载实体(例如,printer.print() 等等)。

【问题讨论】:

    标签: java mysql spring hibernate transactions


    【解决方案1】:

    解决办法是:

    @Transactional(noRollbackFor=Exception.class)
    

    【讨论】:

      【解决方案2】:

      恐怕你可以通过hibernate中的任何API或配置来实现它。我能想到的唯一方法是将您的方法分解为多个方法,并仅将 @Transactional 设置为所需的内容。

      【讨论】:

      • 但是如果我没有在方法中设置@Transactional 是事务自动启动还是我应该手动启动呢?
      • 我试过了,没有 @Transactional 我得到“无法初始化代理 - 没有会话”
      【解决方案3】:

      transactionManager 注入该方法的bean,并在需要时通过它执行commit/rollback。看看my answer in this question

      【讨论】:

      • 它可能会解决,但我无法理解如何获取事务...我只是得到这个 bean:org.springframework.orm.hibernate4.HibernateTransactionManager 但如何获取由@Transactional 打开的当前事务注释?
      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多