mysql - 在 mysql 池中使用回滚

标签 mysql node.js

正在关注 this教程 我已经 promise 了 mysql 库,它允许我使用 .then 而不是回调函数。

这是我对 mysql 池的设置:

   var mysql = require('mysql')
    var pool = mysql.createPool({
        connectionLimit: 10,
        host: 'localhost',
        user: 'matt',
        password: 'password',
        database: 'my_database'
    })
    pool.getConnection((err, connection) => {
        if (err) {
            if (err.code === 'PROTOCOL_CONNECTION_LOST') {
                console.error('Database connection was closed.')
            }
            if (err.code === 'ER_CON_COUNT_ERROR') {
                console.error('Database has too many connections.')
            }
            if (err.code === 'ECONNREFUSED') {
                console.error('Database connection was refused.')
            }
        }
        if (connection) connection.release()
        return
    })
    pool.query = util.promisify(pool.query)
    module.exports = pool

这个设置让我的生活变得如此轻松,直到现在我不知道如何处理回滚事务。

我正在运行这样的查询:

    pool.query('InsertQuery').then(rows=>{
                return pool.query(`Select LocationID from Locations where LocationName = '${location[i]}'`)
            })
            .then(rows=>{
                locationID =rows[0].LocationID

                return pool.query(`Select StageID from Stages where StageName = '${stage[i]}'`)
            })
.then('anotherInsert')....
        .catch(err=>{
            console.log(err)
        })

最后的 catch block 工作完美,因为只要在任何阶段出现错误,执行就会中断。但是我希望能够回滚事务并且在任何查询出现任何问题时不运行单个查询。有办法实现吗?

最佳答案

事务边界通常发生在比查询本身更高的级别。原因是事务的使用通常表示需要运行多个查询,以便它们全部 提交(或共享相同的隔离规则),或者它们全部 回滚。如果运行单个查询(通常默认使用自动提交),则不需要显式回滚。

鉴于此,您关于如何修改 query 方法以回滚自身而不传递任何更高上下文(如 txn)的问题并不完全有意义。您通常会在某个更高级别开始事务,然后调用一个或多个查询,然后最后提交。或者,如果任何查询发生任何错误,则回滚。因此,您的一个选择可能是简单地在查询方法中抛出错误,并在更高级别处理 txn。

示例伪代码:

conn = getConnection
.then
  beginTxn
  runQuery1
  runQuery2
  commitTxn
.catch
  rollbackTxn
.finally
  releaseConn

Fwiw,有一些库可以用可能感兴趣的 promise 来包装 mysql 库函数。示例:node-promise-mysql

关于mysql - 在 mysql 池中使用回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57136380/

相关文章:

mysql - 在 MySQL 中创建一个需要每周更新自己的 View

javascript - 将 sails.js 应用作为 Azure WebJob 运行

MySQL 记录磁盘使用计算 |我对吗?

mysql - 计算上类时间和下类时间时间戳之间的小时和分钟

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure

Mysql获取每周间隔的用户列表

node.js - Socket.io/Node.js 和 SSL

javascript - 如何从nodejs中的Spotify API获取播放列表的每一页

javascript - 使用 Stripe API,如何检查用户是否为特定产品付费?

sql-server - Sailsjs 与 Sails-SqlServer 和 Waterline ORM