JMS事务

2024-02-04

数据库事务是一个熟悉的概念。

try {
  ...
  ..
  updateDB()
  ..
  ...
  commit();
} catch error {
  rollback();
}

如果发生任何错误,updateDB 所做的任何更改都将被丢弃。

我想知道消息队列事务回滚将撤消什么。

try{
  ...
  ...
  //EDIT: swapped the order of receive and send
  Message m = queue1.receiveMessage(..)
  ..
  ..
  queue2.sendMessage(..)
  ..
  ..
  commit();
} catch error {
  rollback();
}

具体来说,回滚会做什么

  1. 取消消息的发送
  2. 取消接收消息,即放回收到的消息 消息返回队列

或者我是否把数据库交易的类比延伸得太远了。

thanks

EDIT:我并不是暗示发送和接收操作是相关的。我只是想说有两个操作可以改变消息代理的状态——接收将从队列中取出一条消息,如果有的话,其他消费者将无法使用该消息。


发送的回滚是直接进行的,消息不会被放入队列2。

接收回滚通常会将消息放回队列 (queue1)。 根据您的 JMS 提供程序设置和配置,消息将被重新传送多次。如果事务回滚次数过多(可配置次数过多),它将被放入“回滚队列”(或死信队列)中,这样就不会阻塞队列中的其他消息。撤消的消息通常需要一些手动错误处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JMS事务 的相关文章

  • MySQL 的锁定和并发

    我目前正在将 Mysql 与 InnoDB 存储引擎用于所有表 所以 我想知道这是否是一个真正的问题以及是否有解决方案 例如 我将使用数据库事务向用户收费 1 检查他的余额 2 减去他的余额 3 将此余额记入某处 4 提交 如果更新发生在
  • 取消查询后交易仍处于打开状态

    在 sql server 2008 中 我使用这样的模式 begin transaction begin try do something end try begin catch if TRANCOUNT gt 0 rollback DEC
  • RabbitMQ 上的 Nack 和拒绝

    我想处理消费者从队列中获取的不成功的消息并将它们重新排队 想象一下我有这样的情况 P gt foo bar baz gt C 其中 foo bar 和 baz 是消息 如果消费者读到baz但出了问题 我可以使用basic reject or
  • Celery 和 transaction.atomic

    在一些 Django 视图中 我使用这样的模式来保存对模型的更改 然后根据新的模型数据进行一些异步更新 例如生成图像 进一步更改模型 mytask是一个芹菜任务 with transaction atomic mymodel save my
  • 如何限制 Glassfish v3 上 MDB 池的大小

    我的消息驱动 Bean 执行高度密集的操作 因此我想限制它的池大小 否则我的服务器会过载 我已经尝试过这个 代码 但它不起作用 它的池仍然是32 根据经验测试 我不时重新启动服务器 因此没有池实例 MessageDriven mappedN
  • EF Code First DBContext 和事务

    我想知道实现交易的最佳方式是什么DBContext 尤其 Does DbContext SaveChanges如果我更改多个实体 请在内部实施交易 如果我想打电话DbContext SaveChanges多次 相同上下文 不同上下文 如何实
  • org.hibernate.AssertionFailure

    我的线程执行时有时会遇到这个奇怪的错误 这可能与什么有关 2011 Jun 25 09 05 22 339 ERROR AssertionFailure 45 an assertion failure occured this may in
  • 如何将查询设置为未提交读取?

    使用hibernate 如何将查询设置为未提交读取 我不希望这是一个全局设置 只想在每个查询的基础上进行设置 将 Spring 与 Hibernate 结合使用 可以让 Spring 通过注释控制事务 即 spring applicatio
  • 如何获取Oracle中命名事务的名称?

    我想在触发器中使用事务的名称 以便将其写入列中 我尝试了这个 在 SQL Developer 中 set transaction name hello select DBMS TRANSACTION LOCAL TRANSACTION ID
  • 从远程客户端使用 Glassfish JMS

    我在服务器上安装了 glassfish 并使用 JMS ConnectionFactory 设置了具有资源类型或 javax jms ConnectionFactory 的 jms ConnectionFactory 我现在想从本地计算机上
  • 与竞争的消费者顺序处理消息

    Problem 我以特定顺序 FIFO 在队列上接收消息 比如订单 我的队列中有竞争的消费者 为了进一步增加复杂性 消费者可能只对订单的特定版本感兴趣 具体取决于其状态 例如版本 1 版本 2 和版本 5 订单版本号在订单上可用 但不能用于
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 设置约束可延迟在 PostgreSQL 事务上不起作用

    情况是这样的 我有两个表 其中一个引用另一个 例如 table2 引用 table1 创建这些表时 我确实将外键约束设置为 DEFERRABLE 将 ON UPDATE 和 ON DELETE 子句设置为 NO ACTION 这是默认值 但
  • withTransaction 和 withNewTransaction 有什么区别?

    以下动作有什么区别 def someAction User withTransaction and def someAction User withNewTransaction 我什么时候用什么 当 grails 操作仅包含 Transac
  • 带回调或异步/等待的节点 postgres 事务?

    我正在运行 Node 7 6 0 它支持 async await node postgres 客户端池支持 async await 并且有一个很好的示例here https github com brianc node pg pool pl
  • 使用 Hibernate 和 MySQL、全局和本地进行 Spring 事务管理

    我正在使用 MySQL Server 5 1 Spring 3 0 5 和 Hibernate 3 6 开发 Web 应用程序 我使用 Springs 事务管理 我是新手 所以如果我问一个容易回答的问题 请耐心等待 1 我读到了有关全局 x
  • 使用@Transactional注解批量插入

    在我的 Spring 应用程序中 我想一次性在数据库中插入近 1500 条记录 我在后端使用 Spring 4 X 和普通休眠 在我的服务层中 我使用 Transactional 注释 现在 在某个时间点之后插入记录时 我遇到内存不足错误
  • IBM MQ - 如何使用多个连接名称连接到队列管理器(一个是故障转移)

    我对 IBM MQ 还很陌生 我的是一个多实例队列管理器 一种情况就像故障转移 即使其中之一已关闭 我如何才能连接到它们 我不确定我的术语是否正确 我现在尝试使用下面的示例进行连接 https raw githubusercontent c
  • NHibernate 具有多个数据库和事务

    我们在理解如何最好地使用 NHibernate 时遇到了一些问题 我们通常拥有相对大量 就表数量而言 的 SQL Server 数据库 而不是一个包含大量对象的数据库 我们正在研究处理多个会话工厂的各种选项 并且可能已经控制住了这一点 但是
  • Spring Integration中的异常:如何记录但不拦截

    假设我有一个基本的 Spring 集成流程 例如

随机推荐