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

Hibernate 4中的事务管理和多线程

潘胤
2023-03-14

我需要执行父任务,父任务可能有子任务,也可能没有子任务。每个父任务和子任务都应该在线程中运行。如果父任务或子任务执行中出现错误,则必须回滚父任务和子任务的事务。我正在使用hibernate4。

共有2个答案

董同
2023-03-14

根据OP预期,这里有一个用于Hibernate 4独立会话管理和jdbc事务的伪代码(我个人建议使用容器(Java ee或spring)和JTA容器管理的事务)

在hibernate.cfg.xml中

<property name="hibernate.current_session_context_class">thread</property>

SessionFactory:

Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build());

会话工厂应该使用单例公开(无论您选择何种方式,整个应用程序都必须只有一个实例

public void executeParentTask() {
  try {
      sessionFactory.getCurrentSession().beginTransaction();

      sessionFactory.getCurrentSession().persist(someEntity);

      myChildTask.execute();

      sessionFactory.getCurrentSession().getTransaction().commit();
  }
  catch (RuntimeException e) {
      sessionFactory .getCurrentSession().getTransaction().rollback();
      throw e; // or display error message
  }
}

getMONtSession()将返回绑定到当前线程的会话。如果您自己管理线程执行,您应该在线程执行开始时创建会话并在结束时关闭它。

子任务将使用sessionFactory.getCurrentSession()检索与父任务相同的会话

看https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch03.html#configuration-sessionfactory

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#transactions-划界非管理

您可能也会发现这很有趣:如何在Hibernate 4.3.4.Final中配置和获取会话?

商畅
2023-03-14

如果我得到它,父任务和子任务将在不同的线程中运行。

对我来说,这是一个非常糟糕的主意,不值得考虑。

虽然使用jta事务可能是可能的,但使用Hibernate事务管理委托到底层jdbc连接显然不是这种情况(您每个会话有一个连接,并且不得在线程之间共享Hibernate会话)。

使用jta,您必须自己处理连接检索和事务,因此不能利用连接池和容器管理的事务(spring或java ee)。由于在两个线程之间共享数据库连接可能只会将瓶颈降低一个级别,因此它可能会过于复杂,几乎没有性能改进。

查看如何在多线程之间共享一个事务

 类似资料:
  • Spring Transaction不支持多线程,所以我尝试在thread的run()方法中手动管理事务。但是,没用! 我想在下面的示例中回滚每个线程的run()方法,当其中有异常抛出时。(在以下情况下,插入到UNKNOWN_TABLE) 我的预期结果是“开始,1,3,5,结束”。 而实际结果是‘开始,1,2,3,4,5,结束’。 欢迎任何回复!谢谢! 主要类别: 服务等级:

  • 问题内容: 我正在使用Callable接口在serviceImpl中编写多线程程序。我正在使用spring事务管理器。在DB中执行更新操作时,它会成功执行。但是更新后的数据不会反映在DB中。但是,当我运行不带多线程的程序时,它将在DB中更新。 这是我的配置 我可以转向事务管理器的另一种方法。只是我想确认这种方法是否支持多线程。所以我的问题是 spring事务管理器是否支持多线程(我的意思是仅通过声

  • 我在批处理作业中使用多线程步骤来处理来自源数据库的记录并写入目标数据库。该步骤基于块,由JdbcpagingItemReader、Processor和JDBCBathItemWriter组成。我明白,如果在步骤处理期间发生任何异常,数据库事务将回滚整个块。我想了解一下Spring batch在内部是如何管理的?由于这是多线程步骤,因此不能保证处理器和写入器在块的同一线程中执行。块可能由不同的线程处

  • 管理交易 在 1.4 版更改: 对会话事务管理进行了修改,使其更清晰、更易于使用。特别是,它现在具有“autobegin”操作的特点,这意味着事务开始的点可以被控制,而不必使用传统的“autocommit”模式。 这个 Session 一次跟踪单个“虚拟”事务的状态,使用一个名为 SessionTransaction 。然后,该对象利用基础的 Engine 或引擎,而这些引擎 Session 对象

  • 我正在使用Spring AMQP(RabbitMQ实现),我试图将单个事务传播到多个线程中。 例如,假设有3个队列,名称为X、Y、Z,首先我使用thread-1从队列X获取一条消息,然后,该消息被提供给thread-0,thread-0中的消息被克隆并通过thread-3发送到队列Y、thread-2和队列Z。线程0等待线程3和线程4的完成,以提交或回滚消息。注意,这里我使用了4个线程。 我想要的

  • 事务处理(transaction processing) 可以用来维护数据的完整性,保证SQL的操作要么完全执行,要么完全不执行,如果发生错误就进行撤销。 保证数据的完整性。 保证数据不受外影响。 事务处理的几道术语 事务(transaction) 一组SQL语句 退回(rollback)撤销执行SQL语句的过程 提交(commit) 将为执行的SQL语句写入数据库表 保留点(savepoint)