gpt4 book ai didi

javascript - 在 Node.js 中处理回滚的 MySQL 事务

转载 作者:IT老高 更新时间:2023-10-28 23:26:38 30 4
gpt4 key购买 nike

我这几天一直在处理一个问题,我真的希望你能帮助我。

这是一个基于 node.js 的 API,使用 sequelize 用于 MySQL

在某些 API 调用中,代码会启动锁定某些表的 SQL 事务,如果我同时向 API 发送多个请求,则会出现 LOCK_WAIT_TIMEOUT 错误。

var SQLProcess = function () {
var self = this;
var _arguments = arguments;

return sequelize.transaction(function (transaction) {
return doSomething({transaction: transactioin});
})
.catch(function (error) {
if (error && error.original && error.original.code === 'ER_LOCK_WAIT_TIMEOUT') {

return Promise.delay(Math.random() * 1000)
.then(function () {
return SQLProcess.apply(self, _arguments);
});

} else {
throw error;
}
});
};

我的问题是,同时运行的请求相互锁定了很长时间,我的请求在很长一段时间(~60秒)后返回。

我希望我能解释清楚易懂,你可以给我一些解决方案。

最佳答案

这可能不是您问题的直接答案,但也许通过查看您遇到此问题的原因也会有所帮助。

1) doSomething() 有什么作用?无论如何我们可以在那里做一些改进?

首先,需要 60 秒的事务是可疑的。如果您将表锁定这么长时间,则很有可能应该重新访问设计。给定一个典型的数据库操作运行 10 - 100 毫秒。

理想情况下,所有数据准备都应在事务之外完成,包括从数据库读取的数据。并且事务实际上应该只用于事务性操作。

2) 是否可以使用mysql存储过程?

确实,mysql 的存储过程没有编译为 Oracle 的 PL/SQL。但它仍在数据库服务器上运行。如果您的应用程序真的很复杂,并且在该事务中包含大量反向和强制数据库和您的 Node 应用程序之间的网络流量,并且考虑到有如此多的 javascript 调用层,它可能真的会减慢速度。如果 1) 不能为您节省很多时间,请考虑使用 mysql 存储过程。

显然,这种方法的缺点是在 nodejs 和 mysql 中都很难维护代码。

如果 1) 和 2) 绝对不可能,您可以考虑使用某种流量控制或排队工具。要么您的应用程序确保第二个请求在第一个请求完成之前不会发送,或者您有一些第 3 方排队工具来处理它。看来您在运行这些请求时不需要任何并行性。

关于javascript - 在 Node.js 中处理回滚的 MySQL 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35034685/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com