首页 > 其他 > 详细

记一次MQ异常、且事务自动提交 导致的生产问题

时间:2020-03-20 12:03:23      阅读:68      评论:0      收藏:0      [点我收藏+]

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

没有设置手动提交事务,异常处理不当,且数据库交易流水未加唯一索引,而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) {
                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);  //抛出异常
      }
  }

}    

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

 

记一次MQ异常、且事务自动提交 导致的生产问题

原文:https://www.cnblogs.com/pluto-yang/p/12530145.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!