Gorm原子更新到增量计数器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gorm原子更新到增量计数器相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

一种可能的解决方案是使用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

另一答案

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

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

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

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

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

以上是关于Gorm原子更新到增量计数器的主要内容,如果未能解决你的问题,请参考以下文章

GORM 和 SQL Server:自动增量不起作用

Redis中哈希的原子GETSET

shared_ptrs 是不是由于引用计数器原子递增/递减而遇到缓存未命中?

ZooKeeper : Curator框架之共享计数器DistributedAtomicLong

为啥保守光栅化无法为某些三角形调用片段着色器?

如何在 Gorm 中留下连接子查询计数