单个数据库的JTA

问题描述 投票:0回答:1

我只是在学习JTA,如果我只有一个数据库,我不知道是否应该使用它。目前,我使用hibernate 5作为JPA提供程序,并且如果需要在方法之间使用一个事务,则只需将EntityManager作为参数传递即可。

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

java hibernate jpa transactions jta
1个回答
0
投票

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

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

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

[请注意,@Transcational与JTA或本地事务无关。它对两种交易类型均适用。

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

© www.soinside.com 2019 - 2024. All rights reserved.