为了账号安全,请及时绑定邮箱和手机立即绑定

当同时运行时,如何防止两个Node进程插入完全相同的数据库记录?

当同时运行时,如何防止两个Node进程插入完全相同的数据库记录?

心有法竹 2021-04-30 16:11:01
我有一个Lambda,可以一次发送数千个事件。并发保留为默认值,这意味着AWS将启动多个实例来处理传入事件。Lambda会获取数据并将一些数据插入数据库(如果该数据尚不存在)。Lambda用Node.js编写,并使用Knex连接到Postgres数据库。Lambda本质上包含以下逻辑:Does a record with ID X exist?     a. Yes: do nothingb. No: create a new record with ID X.问题在于,当同时启动50个Lambda时,它们将进入竞争状态,例如其中3或4个将同时(或彼此之间以毫秒为单位)检查现有记录找到它,因此插入多个重复的记录。我知道解决此问题的一种方法是在表上创建唯一约束,以防止ID为X的多个记录。然后,我的逻辑将如下所示:Does a record with ID X exist? a. Yes: do nothing b. No: create a new record with ID X.   b.1. Did that succeed?      a. Yes: continue on.      b. No, it threw a unique constraint error: go back to line 1.这似乎有些人为的,但应该可以。有更好的选择吗?编辑:这是实际的代码:let location = await Location.query().where({ external_id }).first();if(!location){    location = await Location.query().insert({        name,        external_id    });}
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信