java - 单一数据库的 JTA
问题描述
我只是在学习 JTA,如果我只有一个数据库,我不明白是否应该使用它。目前我使用 hibernate 5 作为 JPA 提供者,如果我需要在方法之间使用一个事务,我只需将 EntityManager 作为参数传递。
但是,我不喜欢这种方法,因为我需要记住事务是否打开。我想找到任何可以帮助我在 SE 环境中控制事务(但没有 Spring)的库。那么,我应该在我的情况下使用 JTA 还是应该使用不同的东西?
解决方案
通常在谈到 JTA 时,它是指跨多个系统的分布式事务(例如跨两个数据库、一个数据库和一个符合 JMS 的消息代理)。如果您只有一个数据库,则不必使用 JTA 事务,尽管它也应该可以工作。相反,对一个数据库使用本地事务,理论上应该比使用 JTA 事务更快。
另一方面,如果您只是谈论@Transactional
在 JTA 中定义的,它允许您通过在方法上注释它而不在方法之间传递 EntityManager 来声明式地控制事务边界,您应该查看哪些框架支持它。
在幕后,代理的 EntityManager 被注入到不同的类中,这样当它被调用时,它将从 ThreadLocal 中获取实际的 EntityManager。因此,同一线程中的每个类都将获得相同的 EntityManager,这会阻止您在方法周围传递 EntityManager。@Transactional
一个新的 EntityManager 实例将在使用某种 AOP 技术执行该方法之前设置为 ThreadLocal 。
请注意,@Transcational
与底层交易无关的是 JTA 或本地交易。它应该适用于两种交易类型。
我会使用支持@Transactional
SpringQuarkus
或Micronaut
etc 的框架,并将 Hibernate 配置为使用本地事务,而不是单个数据库的 JTA 事务。
推荐阅读
- spring-boot - 如何将AspectJ java项目编织到Spring boot项目中
- nginx - nginx RTMP 实时更新 html 以显示“on air”
- c++ - 如何确定 FSLogix 是否在 C++/Windows 中运行?
- c# - C# 提取类型并在另一个泛型函数中用作类型参数
- javascript - 两个对象合并,两个日期匹配所有记录
- configuration - 如何将 `0.pool.ntp.org` 放入 `/etc/nftables.conf` 没有任何错误?
- python - 当我添加类型为 varchar(100) 的列时,Pymysql 查询抛出错误
- kubernetes - 当副本数为 1 且 minAvailable 也为 1 时,节点自动缩放器能否自动启动额外的 pod?
- python - 从 sklearn 解释决策树节点的信息
- vue.js - Vue 3 + Vue Router 根页面组件在应用重新初始化时渲染失败