正在关注 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/