在一个Hibernate会话中可以有多个事务吗?

我不清楚这是否是允许的.在我的代码中,我有一个长时间运行的线程,从阻塞队列中获取项目,这取决于队列上的内容,它可能需要创建并保存一个hibernate对象,或者可能不需要执行任何操作.

每个项目都是不同的,因此,如果项目1已保存,而项目2未能保存,无论出于何种原因,我都不想这样做,以防止项目1被添加到数据库中.

因此,要做到这一点,最简单的方法是针对需要创建新会话、打开事务、保存新对象、提交事务、关闭会话的每个项目

然而,这意味着 for each 项目创建一个新的会话,这似乎与Hibernates自己不按请求进行会话模式的建议背道而驰.因此,我的替代方案是在线程中创建一个会话,然后在需要创建新对象时根据需要打开并提交一个新事务.但我没有看到这种方法的例子,我不确定它是否真的有效.

推荐答案

如果运行本地事务,每个请求的会话模式在每个会话中使用一个JDBC连接.对于JTA来说,在每条语句之后都会主动释放连接,但在下一条语句中会重新获得连接.

Hibernate事务API将开始/提交/回滚委托给本地事务的JDBC连接和JTA的关联UserTransaction.因此,您可以在同一个Hibernate会话上运行多个事务,但有一个缺点.一旦抛出异常,就不能再重用该会话.

我的建议是分而治之.只需拆分所有项目, for each 项目构造一个Command对象,然后将它们发送到ExecutorService#invokeAll.使用返回的列表迭代并调用Future#get(),以确保原始线程在所有批处理作业(job)完成后等待.

ExecutorService将确保您同时运行所有命令,并且每个命令都应该使用使用自己的@Transaction的服务.因为事务是线程绑定的,所以您将拥有所有batch jobs run in isolation个事务.

Database相关问答推荐

在多组MongoDB中查找最新文档的有效方法

我们可以出于不同目的在同一 postgres 数据库上同时进行物理和逻辑复制吗?

mongodb聚合从另一个查询中获取值

嵌入式的 best数据库是什么?

如何在我的 Rails 应用程序中避免竞争条件?

多列索引的顺序

PostgreSQL 将列从整数转换为文本

MongoDB:查询具有两个相等字段 $match 和 $eq 的文档

在 sql server 中存储持续时间(时间跨度)

db:schema:load vs db:migrate with capistrano

在 SQL 数据库之间共享数据

如何在 MySQL 中强制执行唯一约束?

Hibernate 的 MariaDB 方言类名称是什么?

传递依赖有什么问题?

在 SQL Server 中实施审计表的建议?

分离实体和被管理实体

我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?

数据库与纯文本

是否有用于 postgresql 的数据可视化工具,它也能够显示模式间关系?

不同类型的SQL之间的区别?