【问题标题】:Kill running query with Sequelize使用 Sequelize 终止正在运行的查询
【发布时间】:2021-03-25 11:42:58
【问题描述】:

我正在使用 sequelize 和 MySQL DB。我有一些繁重的查询,用户可以通过单击 GUI 中的“取消”按钮来取消。

我尝试使用事务来执行此操作,但是当我执行t.rollback() 时,查询不会在数据库中被杀死。有没有办法使用 sequelize 终止查询?
我更喜欢使用 sequlize 来做,但即使获取查询 ID 并手动杀死它也可以。

 .transaction(async (t) => {
        if (transaction) {
            transaction.rollback();
        }
        transaction = t;
        return db.myTable.findAll(data);
      })
      .then((data) => {
        transaction = {};

        return data;
      })
      .catch((error) => {
        transaction = {};
        throw error;
      });

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    Sequelize 本身不支持。有一个open, inactive issue 可以在其中添加此功能,还有一个workaround used for PostgreSQL

    const killableQuery = async (query, req, options = {}) => {
      const connection = await sequelize.connectionManager.getConnection();
    
      req.on('close', () => {
        sequelize.query(`SELECT pg_terminate_backend(${connection.processID});`)
          .catch((error) => {
            console.error('Unable to terminate query!', error);
          });
      });
      const result = await sequelize.query(query, {
        ...options,
        transaction: { connection },
      });
    
      await sequelize.connectionManager.releaseConnection(connection);
    
      return result;
    };
    

    抱歉,我找不到有关 processID 属性的详细信息,以及它是否对应于 MySQL 跟踪的属性。如果是,可以将 PostgreSQL 语句替换为 MySQL counterpart,例如:

    SELECT GROUP_CONCAT(CONCAT('KILL ',id,';') SEPARATOR ' ') 
    FROM information_schema.processlist
    WHERE user <> 'system user'
    AND -- <condition based on processID>;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2017-08-06
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多