单一数据库的JTA

JTA for single database

刚学JTA,不知道只有一个数据库还用不。目前我使用 hibernate 5 作为 JPA 提供程序,如果我需要在方法之间使用一个事务,我只需将 EntityManager 作为参数传递。

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

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

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

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

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

我会使用支持 @Transactional 的框架,例如 Spring 、 Quarkus or Micronaut 等,并将 Hibernate 配置为使用本地事务而不是单个数据库的 JTA 事务。