问题标签 [bean-managed-transactions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在单独的 EJB 方法中开始/结束事务
我开发了一个典型的企业应用程序,负责将客户配置到第 3 方系统。该系统有一个限制,即只有一个线程可以处理某个客户。所以我们添加了一个简单的锁定机制,@Singleton
其中包含一个Set
当前正在进行的 customerIds。每当有新的供应请求出现时,它首先检查 this Set
。如果 customerId 存在,它会等待,否则将其添加到Set
并进入处理。
最近决定,这个应用程序将部署在集群中,这意味着这种锁定方法不再有效。我们提出了一个使用 DB 进行锁定的解决方案。我们创建了一个包含 customerIds 的单列表(它也有一个唯一的约束)。当一个新的供应请求到来时,我们开始一个事务并尝试用 customerId 锁定行SELECT FOR UPDATE
(如果 customerId 还不存在,我们插入它)。之后,我们开始配置客户,完成后,我们提交事务。概念有效,但我在交易方面遇到问题。目前我们有一个类CustomerLock
和方法来处理添加和删除add()
customerIds 。我想将此类转换为具有 bean 管理事务的无状态 EJB。remove()
Set
add()
方法将启动事务并锁定行,而remove()
方法将提交事务并因此解锁行。但似乎事务的开始和结束必须以相同的方法发生。有没有办法使用我描述的方法,或者我必须修改逻辑以便事务以相同的方法开始和结束?
客户锁类:
CustomerProvisioner 类摘录:
StandardCustomerProvisioner 类:
java - WildFly 13 迁移 - 仅允许具有 bean 管理的事务划分的会话和消息驱动的 bean 访问 UserTransaction
我有一个“XAManager”类,用于 WildFly 13 中的 JCA 组件。
在standalone-full.xml 中,有问题的资源适配器定义如下:
...
……
此类在 JCA 的 ManagedConnection 类中使用,在 getXAResource() 方法中返回:
公共 XAResource getXAResource() 抛出 ResourceException {
}
类定义如下:
公共类 LuceneXAManager 实现 XAResource {
}
我遇到的问题是,当尝试通过 JNDI 获取 UserTransaction 时,我得到了Caused by: javax.naming.NameNotFoundException: UserTransaction [Root exception is java.lang.IllegalStateException: WFLYEJB0137: Only session and message-driven beans with bean-managed transaction demarcation are allowed to access UserTransaction]
我尝试用注释我的班级@Stateless
并@TransactionManagement(TransactionManagementType.BEAN)
解决这个问题,但没有用。我也尝试通过 @Inject UserTransaction 注入 UserTransaction 但在这种情况下 UserTransaction 为空。
有任何想法吗 ?
cdi - TransactionImpleManager.suspend 隐式调用
我有使用 BMT 的 bean。另一个使用 BMT 的 bean 被注入到第一个中。现在,当第一个调用第二个的方法时,事务突然关闭。在我的代码中,我将其范围缩小到方法调用之前及其内部的确切位置。
这是跟踪:
2018-11-23 12:15:32,275 +0100 [TRACE] [com.arjuna.ats.jta](默认任务 18)TransactionImple.getStatus:javax.transaction.Status.STATUS_ACTIVE
2018-11-23 12:15:32,276 +0100 [TRACE] [com.arjuna.ats.jta](默认任务 18)TransactionImpleManager.suspend
2018-11-23 12:15:32,277 +0100 [TRACE] [com.arjuna.ats.jta](默认任务 18)TransactionSynchronizationRegistryImple.getTransactionKey
示例代码:
发生在 JBoss EAP 7.0.9 上。
我在很多地方都有这个星座,但只有在这里它坏了。我错过了一些基本的东西吗?我在哪里可以找到更多线索?
jakarta-ee - 什么是具有容器管理事务优势的 JTA
我将 JavaEE 8 与 OpenLiberty Application server 一起使用。
在我的项目中,我尝试在 CRUD 层中使用 JTA over container managed transaction (BMT)。
这是我的示例代码:
和食品实体:
我想了解:
在 sql 插入/删除/更新操作之前,是否有任何建议选择数据库?
我问这个问题是因为在 CMT 模式下无法捕获应用程序上的约束或 SQL 异常。
在我的示例代码中:
- 需要在持久化之前选择,因为重复键异常会导致应用程序服务器。
- 需要在删除之前选择,因为在应用程序服务器中找不到实体异常结果。
什么是具有容器管理事务 (CMT) 优势的 JTA?