问题标签 [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.
jsf - bean 托管事务如何工作?
我对 EJB 和 Bean Managed Transactions 都是新手。在网上报废后,我发现我可以编写一个 EJ 会话 Bean,它以“bean 管理的方式”进行事务,如下所示:
但是,我不明白如果 Op3() 抛出异常会发生什么。Op1() 和 Op2() 如何撤消?
另一个问题是如何将它绑定到 JSF?我需要在 JSF 中编写一个表单,将其数据发送到服务器,并且 OperationBean 根据接收到的数据执行 3 次操作。这些操作确实涉及数据库操作(3 次更新)并且单独没有意义。
谢谢!
jboss - 如何使用 BMT 将客户端 UserTransaction 传播到无状态会话 bean
使用 CMT 的这种情况是有效的:
带有 CMT 的无状态会话 bean,一种用
@TransactionAttribute(TransactionAttributeType.MANDATORY)
. 在此方法中,使用 XA 数据源和普通 JDBC 将记录写入 RDBMS。独立客户端(单独的 JVM,命令行 Java 应用程序)
UserTransaction
从应用程序服务器(通过 JNDI 查找)获取一个,启动事务,并调用 EJB。如果客户端提交
UserTransaction
,则将记录写入数据库。- 如果客户端回滚
UserTransaction
,则记录不会写入数据库。 在 PostgreSql 日志文件中,可以看到带有 BEGIN 和 COMMIT 或 ROLLBACK 的准备好的事务
如果客户端在调用 EJB 之前没有启动事务,
javax.ejb.EJBTransactionRequiredException
则会抛出 a(如预期的那样TransactionAttributeType.MANDATORY
)。
现在我从 CMT 切换到 BMT
同样,如果客户端在调用 EJB 之前没有启动事务,
javax.ejb.EJBTransactionRequiredException
则会抛出 a(如预期的那样,TransactionAttributeType.MANDATORY)。如果我打电话
sessionContext.getUserTransaction().getStatus()
,它总是报告Status.STATUS_NO_TRANSACTION
。commit
如果客户端调用或,记录总是写入数据库rollback
。在 PostgreSql 日志文件中,没有准备好的事务,只是简单的插入命令。
EJB的来源:
客户来源:
我正在使用 JBoss 6.0.0 最终版。
如何使用 BMT 正确地将客户端 UserTransaction 传播到 EJB 中?
jakarta-ee - 为什么带有 bean 管理事务的 EJB bean 充当“事务屏障”?
来自EJB 3.1 规范的引用:
13.6.1 Bean管理的事务划分
容器必须使用 bean 管理的事务划分来管理对企业 bean 实例的客户端调用,如下所示。当客户端通过企业 bean 的客户端视图之一调用业务方法时,容器将挂起任何可能与客户端请求相关联的事务。
另一方面,来自独立客户端或另一个 EJB 的事务使用容器管理的事务传播到 bean 中。从 CMT 的角度来看,使用 CMT 的 bean 似乎有一个额外的重要特性(事务传播)。
使用 BMT 对 bean 施加这种限制(“事务障碍”)的原因是什么?
相关问题:
transactions - Bean Managed MDB 和数据库异常
我有一个 Bean 管理的MDB -InvoiceInquiryMessageBean,它具有以下定义,它调用一个CMT - InvoiceManager ,它执行数据库操作。
MDB 被明确提到为Bean 托管,并且 onMessage() 有一个事务NOT_SUPPORTED。因此,此 MDB 在没有事务划分的情况下运行。
下面的 InvoiceManager bean没有定义事务类型或事务属性。因此默认情况下,它是一个容器管理的 CMT ,并且默认情况下具有REQUIRED事务类型。此bean 执行数据库操作。问题是
问题 #1
如果在执行数据库操作时出现任何错误/异常,例如(违反主键,数据库死锁,如 SQL 服务器错误代码 1205),则认为数据库事务失败。此数据库事务失败是否会影响调用 MDB。
这个问题的原因是我看到有时在数据库异常期间消息被重新传递到 MDB。尽管 MDB 被定义为不参与任何容器管理的事务,但 db 问题与数据库事务相关,这会导致消息重新传递到 MDB。
如果我的问题不清楚,请告诉我。
java - 只读事务在我的 AOP 配置中不起作用
我正在尝试学习如何使用 AOP,并且我正在尝试在 Spring 的应用程序上下文中设置一个只读事务,但它不起作用,它仍然将数据提交到数据库。
我真的不知道我做错了什么,如果你能帮助我,我会很高兴。
应用程序上下文.xml
索引控制器
执行方法的请求代码:
服务
道
依赖性
jakarta-ee - BMT/CMT 和应用程序/容器管理的 EntityManager 之间有什么关系?
该主题的各种部分描述使我怀疑 BMT 与应用程序管理的 EntityManager(以及 UserTransaction 的使用)密切相关,而 CMT 与容器管理的 EntityManager 密切相关。
任何人都可以给出(或指出)BMT/CMT 与应用程序/容器管理的 EntityManager 的关系的清晰解释吗?
事务分界类型和 EntityManager 管理类型之间允许哪些组合?
- 我可以将应用程序管理的 EntityManager 与 CMT 结合起来吗?
- 我可以将容器管理的 EntityManager 与 BMT 结合使用吗?
另外,UserTransaction 和 BMT/CMT 与应用程序/容器管理的 EntityManager 之间有什么关系?
- 我可以将 UserTransaction 与容器管理的 EntityManager 一起使用吗?
- UserTransaction 是否暗示 BMT,反之亦然?
编辑:根据http://www.byteslounge.com/tutorials/container-vs-application-managed-entitymanager我可以以任何我喜欢的方式将 CMT/BMT 与 application/container-managed EntityManagers 结合起来。这仍然给我留下了关于 UserTransaction 和 BMT 之间关系的问题。一个是否暗示另一个?
编辑:与上面发布的链接相反,http ://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html#bnbra声称“应用程序管理的实体管理器不会自动传播 JTA 事务上下文。此类应用程序在执行实体操作时需要手动访问 JTA 事务管理器并添加事务分界信息。javax.transaction.UserTransaction 接口定义了开始、提交和回滚事务的方法。通过创建实例来注入 UserTransaction 的实例用@Resource 注释的变量”。对我来说,这听起来像是“应用程序管理的实体管理器需要 bean 管理的事务分界”。谁是对的?甲骨文还是 Byteslounge?
jdbc - Java EE 中的事务混合(在 bean 管理方法中调用容器管理的 bean 方法)
除了互联网上的无用教程和规范之外,找不到任何相关信息。
我现在正在努力解决一件事,如果你能帮忙的话。
事情就是这样。
假设我们有两个 EJB 版本 3.0,带有关于它们的事务类型的注释,一个是 bean 管理的(让它成为 BeanManaged),第二个是容器管理的(让它成为 ContainerManaged,多么有创意)。
然后会发生这种情况:
在这一切的机制中发生了什么,bean 管理事务是否变成某种“孤立”的容器管理事务?他们混合吗?如果有的话,它们是如何交互的?一项交易是否与另一项交易分开
这是我的推论,但还有更多。
最后,当我尝试提交 bean 事务时,它说“您好,先生,此事务是托管的,并且禁止手动提交”,SQLException 为沙漠。
然后是批次的东西,我以某种方式收集。添加了 100 个批次后,我想执行它们,但实际上只执行了最后一个,似乎 addBatch 根本不起作用。
任何人都可以联系,或者遇到类似的事情是受欢迎的,每个巫师都会得到免费的饼干。
java - 2 BMT ejbs 1 单 TX = 不可能?
简而言之,并链接到这个主题: 是否有可能有 2 个 EJB 具有Bean 管理的事务性质,其中第一个 EJB 在第二个 EJB 中调用一个方法,并且全部都包装在UserTransaction
从第一个 EJB 开始的单个中?
java - JPA/Hibernate:EntityManager.close() 和 IllegalStateException?
我在 JEE 环境中有一个日志服务,TransactionManagementType.BEAN
因为日志应该独立于 JTA 事务,所以我必须自己处理事务。
目前这个日志服务看起来像这样:
这是使用此服务的端点:
当我添加配方时,会调用 log 方法两次。我可以保证,因为我在数据库中有两个条目,所以它可以按我的需要工作,但是当我阅读 entityManager.close() 方法的文档时:
关闭应用程序管理的实体管理器。调用 close 方法后,EntityManager 实例上的所有方法以及从中获取的任何 Query 和 TypedQuery 对象都将抛出 IllegalStateException,getProperties、getTransaction 和 isOpen 除外(将返回 false)。如果在实体管理器与活动事务相关联时调用此方法,则持久性上下文将保持受管理状态,直到事务完成。
抛出: IllegalStateException - 如果实体管理器是容器管理的
...这实际上不能工作并抛出一个,IllegalStateException
因为我两次使用相同的 EntityManager。(第一次调用 log 时,调用persist()
and close()
,然后再次调用 log 并再次调用persist()
and close()
)。我想了解它为什么会起作用并且不会抛出异常以免将来出现任何不好的惊喜。
java - MQ 队列事务未在 2 阶段事务中回滚
我有一个 EJB 计时器 (EJB 2.1),它具有 bean 托管事务。
计时器代码调用一个业务方法,该方法在单个事务中处理 2 个资源。一种是数据库,另一种是 MQ 队列服务器。
使用的应用服务器是 Websphere Application Server 7 (WAS)。为了确保跨 2 个资源(数据库和队列管理器)的一致性,我们在 WAS 中启用了支持 2 阶段提交的选项。这是为了确保在数据库操作过程中发生任何异常时,发布在队列中的消息会随着数据库回滚而回滚,反之亦然。
以下是解释的流程:
当 Timer 代码发生超时时,调用 DirectProcessor 中的 startProcess(),这是我们的业务方法。此方法有一个 try 块,其中有一个对同一类中的 createPostXMLMessage() 的方法调用。这又调用了 PostMsg 类中的另一个方法 postMessage()。
问题是当我们在 createPostXMLMessage() 方法中遇到任何数据库异常时,虽然数据库部分成功回滚,但之前发布的消息不会回滚。请帮忙。
在 ejb-jar.xml