问题标签 [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.

0 投票
1 回答
964 浏览

java - 在单独的 EJB 方法中开始/结束事务

我开发了一个典型的企业应用程序,负责将客户配置到第 3 方系统。该系统有一个限制,即只有一个线程可以处理某个客户。所以我们添加了一个简单的锁定机制,@Singleton其中包含一个Set当前正在进行的 customerIds。每当有新的供应请求出现时,它首先检查 this Set。如果 customerId 存在,它会等待,否则将其添加到Set并进入处理。

最近决定,这个应用程序将部署在集群中,这意味着这种锁定方法不再有效。我们提出了一个使用 DB 进行锁定的解决方案。我们创建了一个包含 customerIds 的单列表(它也有一个唯一的约束)。当一个新的供应请求到来时,我们开始一个事务并尝试用 customerId 锁定行SELECT FOR UPDATE(如果 customerId 还不存在,我们插入它)。之后,我们开始配置客户,完成后,我们提交事务。概念有效,但我在交易方面遇到问题。目前我们有一个类CustomerLock和方法来处理添加和删除add()customerIds 。我想将此类转换为具有 bean 管理事务的无状态 EJB。remove()Setadd()方法将启动事务并锁定行,而remove()方法将提交事务并因此解锁行。但似乎事务的开始和结束必须以相同的方法发生。有没有办法使用我描述的方法,或者我必须修改逻辑以便事务以相同的方法开始和结束?

客户锁类:

CustomerProvisioner 类摘录:

StandardCustomerProvisioner 类:

0 投票
0 回答
477 浏览

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 为空。

有任何想法吗 ?

0 投票
1 回答
57 浏览

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 上。

我在很多地方都有这个星座,但只有在这里它坏了。我错过了一些基本的东西吗?我在哪里可以找到更多线索?

0 投票
2 回答
128 浏览

jakarta-ee - 什么是具有容器管理事务优势的 JTA

我将 JavaEE 8 与 OpenLiberty Application server 一起使用。
在我的项目中,我尝试在 CRUD 层中使用 JTA over container managed transaction (BMT)。
这是我的示例代码:

和食品实体:

我想了解:
在 sql 插入/删除/更新操作之前,是否有任何建议选择数据库?
我问这个问题是因为在 CMT 模式下无法捕获应用程序上的约束或 SQL 异常。

在我的示例代码中:

  • 需要在持久化之前选择,因为重复键异常会导致应用程序服务器。
  • 需要在删除之前选择,因为在应用程序服务器中找不到实体异常结果。

什么是具有容器管理事务 (CMT) 优势的 JTA?