当前位置: 首页 > 知识库问答 >
问题:

检查JTA事务是否成功提交

周祺
2023-03-14
@ApplicationScoped
public class EntityListener {

    @Inject
    private Event<EntityEvent> event;
    @Inject
    private EntityManager entityManager;
    @Resource
    private UserTransaction userTransaction;

    @PostPersist
    @PostUpdate
    @PostRemove
    public void onChange(Entity entity) {

        // This is only a piece of pseudo code.
        if (userTransaction.isComitted()) {
            // Do something.
        }
    }
}

持久性提供程序只需要在Java EE容器环境中支持CDI注入实体侦听器。如果未启用CDI,则持久性提供程序不得调用依赖于CDI注入的实体侦听器。

当从Java EE环境中调用时,实体的回调侦听器共享调用组件的企业命名上下文,并且在调用回调方法时在调用组件的事务和安全上下文中调用实体回调方法。

例如,如果事务提交是事务属性为RequiresNew的会话bean业务方法正常终止的结果,则PostPersistPostRemove回调将在该组件的命名上下文、事务上下文和安全上下文中执行。

在JPA实体侦听器中是否存在一种方法来知道事务是否被成功提交,从而可以相应地采取不同的操作或根本不采取任何操作?

我希望一个事务不会在提交发生后就完全完成,因此,应该有一种方法可以看到,无论提交发生与否,我正在寻找一种方法来模拟事务范围内的事件,即在事务结束时触发的事件,无论事务是提交还是回滚,都给出事务的状态。

使用具有EclipseLink 2.6.0(JPA2.1)的GlassFish Server 4.1/Java EE 7。

共有1个答案

毋宸
2023-03-14

请参阅CDI规范文件。

事务观察器方法是在触发事件的事务的完成前或完成后阶段接收事件通知的观察器方法。如果事件激发时没有事务正在进行,则会与其他观察者同时通知它们。

  • 在事务的完成前阶段调用完成前观察器方法。
  • 在事务的完成后阶段调用完成后观察器方法。
  • 只有当事务
    成功完成时,才会在事务的完成后阶段调用after success observer方法。
  • 只有在事务失败时,才会在事务完成后阶段调用after failure observer方法。
public enum TransactionPhase {
    IN_PROGRESS,
    BEFORE_COMPLETION,
    AFTER_COMPLETION,
    AFTER_FAILURE,
    AFTER_SUCCESS
}
void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
 类似资料:
  • 我正在使用Ruby和aws sdk从S3下载一个文件夹。如何检查每个文件是否已成功下载?这只是检查本地计算机上是否存在文件吗?

  • 问题内容: 好吧,我是SQL的新手,我刚刚读到,存储过程始终返回一个值,确定该过程中的查询是否已成功执行是一种很好的做法。 所以我有一个带有select语句的简单存储过程,如果要执行,我想返回1,否则返回-1。 您能告诉我如何用SQL编写该条件吗? 如果有关系,我的数据库是MS SQL Server。 谢谢你。 问题答案: 使用输出参数返回成功状态以及Try..Catch块

  • 问题内容: 如何检查连接是否已在事务中?我正在使用Microsoft SQL Server数据库文件。 问题答案: 经过一番搜索,我发现了另一个“堆栈溢出”问题。事实证明,您不能在ADO.NET中嵌套事务。尝试时,您可能最终会启动两个不相关的事务,这会导致并行事务错误。 要查看连接当前是否在事务中,可以执行以下操作: 这将返回嵌套事务的数量。 请注意,您可以手动嵌套事务,而无需使用SqlTrans

  • 我正在尝试开始使用Storm Trident,并使用IOpaquePartitionedTridentSpout和OpaqueMap进行拓扑设置和运行。 然而,我很难找到让spout/函数知道事务是否成功提交的方法。我没有看到任何ack或fail方法,如在常规Storm喷口/螺栓接口。 谢谢

  • 问题内容: 我有一个简单的路线定义: 是唯一的选择吗?感觉很乱。 问题答案: 根据node.js的源代码 不返回任何内容。 如果出现问题,它将抛出一个对象。因此,您应该在一个块中编写。

  • 问题内容: 我用Java编写了一个简短的测试代码,以上传内存中生成的PDF文件。在此测试代码中,我仅使用一个虚拟字节数组,但在实际使用中,我将在该字节数组中放置生成的PDF(最多2-3页)。一切正常:上传文件并设置权限。 但是,由于返回了PutObjectResult,所以我想知道应该如何检查它。还是足以找到AmazonClientException和AmazonServiceException异