接收到普通Exception,事务无法回滚解决方案

代码写法:

复制代码
1 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = { Exception.class })
2     public void delRules(Integer id,String type) throws Exception {
3         ruleProductMapper.delRuleProductByRuleId(id, type);
4         ruleMapper.deleteByPrimaryKey(id);
5     }
复制代码

出现问题:手动new出异常后,事务不回滚

解决:原因是表的引擎是MySQL默认的myisam而不是Innodb;

java环境中的事物采用spring的xml配置,在service中如果抛出Exception异常,则事物不能回滚。

原来默认spring只在发生未被捕获的runtimeexcetpion时才回滚。spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常,但是可以修改,见解决方法2). 如果抛出runtime exception的话,事务会回滚。 一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.

解决办法有两种:

1、  service中不抛出Exception,使用try捕获后抛出runtimeexcetpion;

2、  修改spring的配置文件

       <tx:method name=”save*” rollback-for=”java.lang.Exception”/>

3.TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常. 在service中增加数据库回滚,不推荐使用。

以下内容转自:http://my.oschina.net/crazyharry/blog/338468

摘要 当你使用了mysql数据库管理数据.事务提交交给代码完成,然而当发生错误的时候事务未回滚。看下这篇文章也许你就明白了

### WebSocket 中实现事务回滚的方法和解决方案 在 WebSocket 应用场景下,由于其主要负责客户端和服务端之间的实时通信,并不直接涉及数据库操作,因此传统意义上的事务管理并不适用。然而,在某些复杂的应用中,可能会涉及到通过 WebSocket 触发的一系列业务逻辑操作,这些操作可能需要跨多个服务或资源执行并保持一致性。 对于这种情况下的“伪事务处理机制可以考虑如下方案: #### 使用消息队列中间件作为协调者 引入像 RabbitMQ 或 Kafka 这样的消息队列系统充当分布式系统的协调角色。每当接收到一个新的请求时,先将其放入消息队列等待进一步处理;如果后续任何一步出现问题,则可以通过取消未完成的消息消费来达到类似事务回滚的效果[^1]。 ```python import pika def callback(ch, method, properties, body): try: # 执行具体业务逻辑 process_business_logic(body) ch.basic_ack(delivery_tag=method.delivery_tag) except Exception as e: print(f"Error occurred: {e}") # 不确认消息,让其重新入队 pass connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='task_queue', durable=True) channel.basic_consume(queue='task_queue', on_message_callback=callback, auto_ack=False) print(' [*] Waiting for messages.') channel.start_consuming() ``` #### 基于事件驱动架构设计补偿机制 采用 CQRS (Command Query Responsibility Segregation) 和 Event Sourcing 的设计理念构建应用程序。在这种模式下,每一个命令都会触发一系列不可变的事实记录(即事件),即使发生错误也可以基于已发生的事实创建新的反向指令来进行修正,从而模拟出事务性的行为特性[^2]。 ```javascript class OrderService { placeOrder(orderDetails) { this.eventStore.publish(new PlaceOrderEvent(orderDetails)); // 如果后面有其他依赖此订单的操作失败, // 可以发布 CancelOrderEvent 来撤销该订单 } cancelOrder(orderId){ this.eventStore.publish(new CancelOrderEvent({ orderId })); } } ``` #### 集成第三方微服务治理框架 利用 Spring Cloud、Dromara Hmily 等开源项目提供的分布式事务能力。这类工具通常提供了 TCC(Try-Confirm-Cancel),Saga 等多种方式用于解决跨服务间的长时间运行任务所带来的挑战,能够很好地适应现代云原生环境的需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值