mysql - Nodejs 续集读取器/写入器异步操作
问题描述
我正在为nodejs上的异步操作寻找解决方案-> sequelize (mysql)
我有一个接收消息的端点(一个 webhook),并执行以下操作:
[1]
sequelize.query(查找消息是否存在...)
[2]
如果 [1] 不存在,则 conversationsModel.create(....) 并返回 'X' 否则返回 'Y' (不创建对象)
我的经验是,我的读者/作家之间就像一场“竞赛”。
我发现一些参考资料说“事务”在这种情况下可能会有所帮助,但如果我们不在同一个请求上下文中(不同的传入 API 请求) - 无论如何它应该有帮助吗?
** 请注意,对于“读取”操作,我使用的是内联查询:
SELECT xxx FROM conversations where context="yyy" AND phoneNumber=:phoneNumber AND createdAt LIKE :time
,`
对于“写”动作,我使用续集模型:
await conversationsModel.create({phoneNumber: to.phoneNumber,context: "team",displayName: "xxx",externalId,message,type: "media",});
你们能建议一个适当的解决方案吗?
提前致谢。
解决方案
这看起来像是何时使用.upsert
静态方法的一个很好的例子sequelize
(请参阅此处的文档)。这是
手册的链接。为了使用此方法,Conversation
模型上必须有一个唯一键或主键。sequelize
例如,假设context
和phoneNumber
属性有一个唯一索引。那么 upsert 声明会是这样的,
let [instance, created] = await ConversationsModel.upsert({
phoneNumber: to.phoneNumber,
context: "team",
displayName: "xxx",
externalId,
message,
type: "media",
})
if (created) {
// New conversation instance was created in database...
// Access the instance here...
} else {
// New conversation instance was not created in database,
// but the existing instance was updated...
// Access the instance here...
}
重要提示: 正如上面链接中所指出的,当使用or时,值 forcreated
仅设置为非空值,但由于正在使用原始问题状态,因此此解决方案就足够了。MySQL
MSSQL
MySQL
免责声明: 如果select
语句和insert/update
语句确实是在单独的 api 请求中完成的,那么如果不让两个请求以某种方式相互通信,就无法避免竞争条件。也许客户端程序可能有某种机制在单独的请求之间进行通信,以避免以某种方式通过数据库进行通信。
推荐阅读
- javascript - 加载以下代码时,在线 IDE 无法运行函数
- ios - 如何在没有真实设备的情况下在 iOS 上测试推送通知?
- javascript - 我在 React 中收到此警告:无法从不同组件的函数体内更新组件
- docker - Docker compose一个接一个地运行多个命令
- python - 我可以在带有 css 和 js 文件的烧瓶应用程序中使用 Bootstrap 吗?
- javascript - 按钮 onClick 后 React 组件未在移动设备上显示,但在桌面上运行良好
- php - Wordpress $current_user 返回空白
- laravel - Laravel 数据表固定列
- antlr - Antlr4中的字符串插值
- wpf - 当我在文本框内单击时,如何在 wpf 中启用弹出控件?