Postgresql 线程安全增量值(db)

Postgresql 线程安全增量值(db),postgresql,go,Postgresql,Go,我遇到了一个问题,不知道如何用DB实现它。在申请方面,我已经准备好了 我有一个产品表,其列被指定为上次使用的端口。当有人点击api时,我需要为服务分配端口。它需要根据其产品名称将最后一个\u端口\u id增加1 一个可能的解决方案是使用redis服务器并在那里同步该值。因为我们没有redis。我希望通过psql实现同样的目标 我读了更多关于锁的内容,我想我需要ACCESS EXCLUSIVElock。这样做对吗 产品 id name start\u端口//11000 end\u端口//1199

我遇到了一个问题,不知道如何用DB实现它。在申请方面,我已经准备好了

我有一个产品表,其列被指定为
上次使用的端口
。当有人点击api时,我需要为服务分配端口。它需要根据其产品名称将
最后一个\u端口\u id
增加
1

一个可能的解决方案是使用redis服务器并在那里同步该值。因为我们没有redis。我希望通过
psql
实现同样的目标

我读了更多关于锁的内容,我想我需要
ACCESS EXCLUSIVE
lock。这样做对吗

产品

  • id
  • name
  • start\u端口//11000
  • end\u端口//11999
  • 上次使用的端口//11023
如何正确地同时处理它?

您可以简单地执行以下操作:

UPDATE products SET last_port_used = last_port_used+1
WHERE   id=...
    AND last_port_used < end_port
RETURNING *
updateproducts SET last\u port\u used=last\u port\u used+1
其中id=。。。
最后使用的端口<结束端口
返回*
这将以线程安全的方式执行更新,并且仅当端口号可用(上次使用的端口号<结束端口号)并返回分配的端口时


如果需要锁定该行,还可以使用SELECT进行更新。

我需要它在其他一些表行中插入此值。我需要将其设置为事务吗?是的,它应该位于事务中,因为如果第二次查询失败,您还希望回滚更新。我想知道,我有大约100个端口可供使用。我需要存储递增的值。如果计数器增加,有没有办法确定。它是存储的,如果发生了一些故障,它会被递减,其他线程会使用这个计数。事务开始->锁定表->inc->store->if fails->dec->COMMITIf pass->commit