java - 什么是简单英语的 "transactional unit of work"?

标签 java transactions jms messaging

这个问题直接来自 previous question of mine所以。我仍然无法理解将 JMS session 用作事务性工作单元 的概念。

来自Java Message Service书:

The QueueConnection object is used to create a JMS Session object (specifically, a Queue Session), which is the working thread and transactional unit of work in JMS. Unlike JDBC, which requires a connection for each transactional unit of work, JMS uses a single connection and multiple Session objects. Typically, applications will create single JMS Connection on application startup and maintain a pool of Session objects for use whenever a message needs to be produced or consumed.

我无法理解短语事务性工作单元的含义。一个简单明了的解释和一个例子就是我在这里寻找的。

最佳答案

工作单元是必须全部完成或什么都不完成的事情。如果它未能完成,那一定就像从未发生过一样。

在 JTA 的说法中,一个工作单元包括在 transaction.begin() 调用和 transaction.commit()< 之间与 transactional 资源的交互调用。

假设您定义了一个工作单元,它从源队列中提取一条消息,在数据库中插入一条记录,然后将另一条消息放入目标队列。在这种情况下,事务感知资源是两个 JMS 队列和数据库。

如果数据库插入后发生故障,则必须发生许多事情才能实现原子性。必须回滚数据库提交,这样数据源中就没有孤立的记录,并且必须替换从源队列中提取的消息。

在这种人为设计的场景中,无论在 unit of work 的哪个位置发生故障,结果都是您开始时的确切状态。

关于消息传递系统,要记住的关键是一个更全局的事务可以由几个更小的原子事务切换队列组成。

Queue A -> Processing Agent -> Queue B --> Processing Agent --> Queue C

虽然在这种情况下并没有真正的全局事务上下文(例如,将 B->C 中的故障一直回滚到 A),但您确实有保证消息将沿着链传递或保留在它们的源队列中。这使得系统在任何时刻都是一致的。可以通过创建错误路由来处理异常状态,以实现更全局的一致性状态。

关于java - 什么是简单英语的 "transactional unit of work"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17343795/

相关文章:

java - 如何在运行时获取 Java 应用程序的真实路径?

java - 神经网络输入的词向量化?

java - 如何将文本文件内容添加到文本文件包含空格的组合框中?

java - 使用 JMS 或 ThreadPool 发送电子邮件

java - Android 应用程序不显示来自网络服务器的数据

java - 使用 Spring 和 Hibernate 长时间运行事务?

.net - 不要回滚 Entity Framework 中的错误事务

node.js - nodeJS 应用程序中的两阶段提交

java - 如何以编程方式和动态方式设置 MDB

jms - 在activemq中更改预取值的位置