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
查询以更改该记录。
SELECT
和UPDATE
语句必须发生在同一连接上,这意味着您需要将它们包装在事务中(否则Go可能会通过不同的连接发送第二个查询)。
请注意,此将使要连接到SELECT
的所有其他连接都等待相同的记录,直到完成UPDATE
。对于大多数应用程序来说,这不是问题,但是如果您具有很高的并发性,或者SELECT ... FOR UPDATE
和UPDATE
之间的时间过长,则可能不适合您。
除了FOR UPDATE
之外,FOR SHARE
选项似乎也可以为您使用,锁定争用更少(但我不太清楚地说这句话)。
注:假设您使用的是支持SELECT ... FOR UPDATE
的RDBMS;如果不是,请更新问题以告诉我们您正在使用哪个RDBMS。
以上是关于Gorm原子更新到增量计数器的主要内容,如果未能解决你的问题,请参考以下文章
shared_ptrs 是不是由于引用计数器原子递增/递减而遇到缓存未命中?