postgresql - db中的线程安全增量值
问题描述
我遇到了一个问题,不知道如何用 DB 来实现它。我在应用程序方面有 go lang。
我有列分配为的产品表last_port_used
。当有人点击 api 时,我需要为服务分配端口。它需要根据其产品名称增加last_port_id
by 。1
一种可能的解决方案是使用 redis 服务器并在那里同步这个值。因为我们没有redis。我想通过psql
.
我阅读了更多关于锁的信息,我认为我需要ACCESS EXCLUSIVE
锁。这是正确的方法吗?
product
id
name
start_port //11000
end_port//11999
last_port_used// 11023
如何同时正确处理?
解决方案
你可以简单地做:
UPDATE products SET last_port_used = last_port_used+1
WHERE id=...
AND last_port_used < end_port
RETURNING *
这将以线程安全的方式执行更新,并且仅当端口号可用时(last_port_used < end_port)并返回分配的端口。
如果需要锁定行,也可以使用 SELECT FOR UPDATE。
推荐阅读
- angular - 尝试在 TypeScript 中发送路由时,模型“Product”的路径“_id”中的值“undefined”转换为 ObjectId 失败
- wget - 在 Moodle 中使用 wget 下载页面
- javascript - 将本地 JSON 文件加载到 HTML 模板中
- android - onActivityResult 不返回成功
- angular - 为什么单击复选框时未触发更改检测?
- angular - Ag-Grid - 单元格下拉复选框
- php - 无法在生产环境中访问 laravel 中的 env 和 config 功能
- android - Firebase 分析日志未显示自定义事件
- laravel - 如何在模型的雄辩关系中搜索术语?
- r - 循环ggplot2多元线性回归