zoukankan      html  css  js  c++  java
  • 记一次MQ异常、且事务自动提交 导致的生产问题

    背景:老项目没有做事务处理

    因为以前同事在做消息队列时

    没有设置手动提交事务,异常处理不当,且数据库交易流水未加唯一索引,而MQ消费异常会自动重发,导致生产出现重复交易数据

    正确的消费者端处理方式:

    public class ReciveRepayQueue extends NQueueCustomer {
    
    @Override
        public void doExecute() throws Exception {
            for (Message message:this.getMessageList()){
    //          Connection conn = getConnection();
                Connection conn = DataSourceOperationUtil.getConnection();
                conn.setAutoCommit(false);  //设置数据库手动提交事务
    
                try {
                    handleBiz(message,conn);
                    conn.commit();      //业务逻辑正常执行完,才commit
                } catch (Exception e) {
              conn.rollback();    //oracle不用rollback,mysql是否需要回滚? e.printStackTrace(); log.
    throw new Exception(e); } finally { //释放连接 DataSourceOperationUtil.releaseConnection(conn); if (!conn.isClosed()) { conn.close(); } } } } private void handleBiz(Message message, Connection conn) throws Exception { try { ... }catch (Exception e){ log. throw new Exception(e); //抛出异常 }   } }

    如果事务自动提交,那么异常前的数据会入库,造成脏数据

  • 相关阅读:
    Ubuntu20 修改网卡名称
    单臂路由实现不同vlan间通信
    配置trunk和access
    基于端口划分vlan
    Zabbix5.0服务端部署
    搭建LAMP环境部署opensns微博网站
    搭建LAMP环境部署Ecshop电商网站
    Zabbix 监控过程详解
    Zabbix agent端 配置
    Zabbix 监控系统部署
  • 原文地址:https://www.cnblogs.com/pluto-yang/p/12530145.html
Copyright © 2011-2022 走看看