Gorm原子更新到增量计数器

问题描述 投票:0回答:2

我实际上具有用户可以增加的计数器。

但是,我想避免两个用户同时增加计数器的竞争状况。

是否有一种方法可以使用Gorm原子地递增计数器,而不是从数据库中获取值,递增并最终更新数据库?

go gorm
2个回答
0
投票

我不确定您的用例。请最用例的例子。

一种可能的解决方案是使用github.com/uber-go/atomic程序包,但是您必须手动调用atom.Inc方法来增加计数器并使用它。

页面上的示例:

// Uint32 is a thin wrapper around the primitive uint32 type.
var atom atomic.Uint32

// The wrapper ensures that all operations are atomic.
atom.Store(42)
fmt.Println(atom.Inc())
fmt.Println(atom.CAS(43, 0))
fmt.Println(atom.Load())

查看其文档中的更多详细信息:https://pkg.go.dev/go.uber.org/atomic?tab=doc


0
投票

如果检索记录时将FOR UPDATE用作query option,则数据库将锁定该特定连接的记录,直到该连接发出UPDATE查询以更改该记录。

SELECTUPDATE语句必须发生在同一连接上,这意味着您需要将它们包装在事务中(否则Go可能会通过不同的连接发送第二个查询)。

请注意,此将使要连接到SELECT的所有其他连接都等待相同的记录,直到完成UPDATE。对于大多数应用程序来说,这不是问题,但是如果您具有很高的并发性,或者SELECT ... FOR UPDATEUPDATE之间的时间过长,则可能不适合您。

除了FOR UPDATE之外,FOR SHARE选项似乎也可以为您使用,锁定争用更少(但我不太清楚地说这句话)。

注:假设您使用的是支持SELECT ... FOR UPDATE的RDBMS;如果不是,请更新问题以告诉我们您正在使用哪个RDBMS。

© www.soinside.com 2019 - 2024. All rights reserved.