首页 > 解决方案 > 单一数据库的 JTA

问题描述

我只是在学习 JTA,如果我只有一个数据库,我不明白是否应该使用它。目前我使用 hibernate 5 作为 JPA 提供者,如果我需要在方法之间使用一个事务,我只需将 EntityManager 作为参数传递。

但是,我不喜欢这种方法,因为我需要记住事务是否打开。我想找到任何可以帮助我在 SE 环境中控制事务(但没有 Spring)的库。那么,我应该在我的情况下使用 JTA 还是应该使用不同的东西?

标签: javahibernatejpatransactionsjta

解决方案


通常在谈到 JTA 时,它是指跨多个系统的分布式事务(例如跨两个数据库、一个数据库和一个符合 JMS 的消息代理)。如果您只有一个数据库,则不必使用 JTA 事务,尽管它也应该可以工作。相反,对一个数据库使用本地事务,理论上应该比使用 JTA 事务更快。

另一方面,如果您只是谈论@Transactional在 JTA 中定义的,它允许您通过在方法上注释它而不在方法之间传递 EntityManager 来声明式地控制事务边界,您应该查看哪些框架支持它。

在幕后,代理的 EntityManager 被注入到不同的类中,这样当它被调用时,它将从 ThreadLocal 中获取实际的 EntityManager。因此,同一线程中的每个类都将获得相同的 EntityManager,这会阻止您在方法周围传递 EntityManager。@Transactional一个新的 EntityManager 实例将在使用某种 AOP 技术执行该方法之前设置为 ThreadLocal 。

请注意,@Transcational与底层交易无关的是 JTA 或本地交易。它应该适用于两种交易类型。

我会使用支持@TransactionalSpringQuarkusMicronautetc 的框架,并将 Hibernate 配置为使用本地事务,而不是单个数据库的 JTA 事务。


推荐阅读