如何解决嵌套承诺的节点 postgres 回滚
我正在我的应用程序中实现一个 auditTrail 模块。除了在我的事务中回滚外,一切都运行良好 - 它确实回滚了事务数据,但不回滚审计跟踪日志:(
这是我所做的:
在我的控制器中,我有(假设)一个 UPDATE EMPLOYEE 函数。对于这个函数,我想记录一些细节(在这种情况下并不重要)......所以假设我只想记录表中发生的事情以及谁做的以及什么时候
我们开始:
user.controller.js
exports.updateUser = async (req,res) => {
const client = await pool.connect() // get client connection from the pool
const id_user = req.params.id
client.query('BEGIN') // begin transaction
.then(async () => {
const isLogged = await logEvent(req.username,'User table update') // who,what (when is in the function)
})
.then(() => {
return client.query(`UPDATE user SET salary = 1000 WHERE user = $1`,[id_user])
})
.then(() => {
client.query('COMMIT')
})
.catch(error => {
console.log(error)
client.query('ROLLBACK')
})
}
auditTrail.middleware.js
async function logEvent(username,action) {
const client = await pool.connect()
const auditTrailSuccess = false
await client.query(`INSERT INTO audit_trail (username,action,datestamp) VALUES ($1,$2,now())`,[username,action])
.then( () => {
auditTrailSuccess = true
})
.catch( error => {
console.log("Audit trail error:",error)
})
return auditTrailSuccess
}
这段代码会发生什么,当一切正常时,它成功更新表并登录审计跟踪......当事务模式(更新用户)出现问题时,它会回滚用户的更新但仍然继续与审计日志...
我如何将回滚也传播到审计跟踪?似乎它不是“父”交易的一部分......
编辑/更新: 我想了一个解决方法.. 在 audit_trail INSERT 查询中,我开始返回插入的 ID,并将其作为 RETURN 的一部分从函数本身返回(因此我可以在控制器中访问它),在回滚部分我正在删除这些记录作为“交易清理”的一部分......
无论如何,问题仍然存在:事务为什么不从 audit_trail 表中恢复(回滚)数据?如果有人能为我阐明这一点,我仍然会很感激..谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。