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

Hibernate事务开始/回滚/提交与session.clear()

涂羽
2023-03-14

我正在处理一些旧的应用程序代码,其中似乎涉及到几个概念,因此我希望能够将它们改进为一个坚实而严格的实践。

基本上,整个代码都用这样的HibernateSessionRequest estFilter包装

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    try {
        sf.getCurrentSession().beginTransaction();            

        chain.doFilter(request, response);

        sf.getCurrentSession().clear();

    } catch (...) {        
        //...
    } finally {
        sf.getCurrentSession().close();
    }

}

然后,有一个拦截器,做这样的事情

private String loadStaff(...) {
    //...

    try {
        dbSession = //...;
        dbSession.beginTransaction();

        // some logic

        dbSession.getTransaction().rollback();

    } catch (RuntimeException e) {
        //..
    }
    finally {
        if (dbSession != null && dbSession.isOpen()) {
            dbSession.clear();
        }
    }
    }

然后还有更多的业务逻辑代码,包括更多的初始事务和会话清除等。

那么,问题是:

  1. 当在同一会话中多次调用beginTransaction时会发生什么

非常感谢。

共有1个答案

仇睿
2023-03-14

您的代码应该是这样的,这是处理单个http请求事务的方法

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    try {
        // Open the transaction.
        sf.getCurrentSession().beginTransaction();            

        // Handle the request
        chain.doFilter(request, response);

        // Persist the db changes into database.
        sf.getCurrentSession().commit();

    } catch (...) {        
        // Somthing gone wrong while handling the http request so we should remove all the changes and rollback the changes that are done in the current request.
        sf.getCurrentSession().rollback()
    } finally {
        sf.getCurrentSession().close();
    }

}

在代码的其他部分不应该处理事务的开始/关闭/提交。它应该只在一个地方处理。

 类似资料:
  • 下面的代码是否可以正常工作,或者我需要在工作之前开始交易。

  • 我是WebServices的新手。Im通过标记为“Transacted”的camel路由向cxfendpoint发送webservice请求,并得到响应。在同一事务路由中,next语句抛出一个异常,以便我的异常处理程序回滚该事务。 我可以在我的事务回滚中找到其他东西,除了我的webservice请求响应,因为它已经提交了。

  • 以下是使用事务教程中描述的提交和回滚的代码示例。 此示例代码是基于前面章节中完成的环境和数据库设置编写的。 复制并将以下示例代码保存到:CommitAndRollback.java 中,编译并运行如下 - 编译并运行结果如下 -

  • 本文向大家介绍基于Postgresql 事务的提交与回滚解析,包括了基于Postgresql 事务的提交与回滚解析的使用技巧和注意事项,需要的朋友参考一下 用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行begin;的话,一执行完就马上提交了,不能

  • 问题内容: 我目前正在阅读Hibernate文档,并且遇到以下引号: 如果Session引发异常(包括任何SQLException),请立即回滚数据库事务,调用Session.close()并丢弃Session实例。某些会话方法不会使会话保持一致状态。Hibernate抛出的异常不能被视为可恢复的。通过在finally块中调用close()来确保关闭会话。 就我而言,这一切都说得通,但这确实让我想

  • 问题内容: 在Hibernate中,当我在事务中有一个对象,然后回滚它时,保存的对象仍保留在DB中。奇怪,因为使用or 方法不会发生此问题,而只会使用。 这是我正在使用的代码: 这是 HibernateUtil 类(只是涉及的函数,我保证该方法能正常工作- 有一个Interceptor处理程序,但现在不重要了): 谢谢 问题答案: 检查数据库是否支持回滚,即是否使用的是InnoDB表而不是MyIS