如何在 GORM(go-gorm) 中进行表锁定?
我找到了一种方法来做 row locking , 但找不到进行表锁定的方法。
最佳答案
您可以根据 gorm.io 使用此代码文档:
行级锁定模式,用于更新
db.Clauses(clause.Locking{Strength: "UPDATE"}).Find(&users)
// SELECT * FROM `users` FOR UPDATE
此外,您可以使用其他锁定模式而不是 UPDATE,例如:KEY SHARE、SHARE、NO KEY UPDATE。
表级锁定模式
对于锁定表,据我所知,Gorm 目前没有选项,因为 Gorm 在合并子句时总是使用 FOR。 但您可以使用原始查询来实现您想要的:
db.Exec("LOCK TABLE table_name_here IN ACCESS EXCLUSIVE MODE")
// LOCK [ TABLE ] [ ONLY ] name [ * ] [, ...] [ IN lockmode MODE ] [ NOWAIT ]
其中锁定模式是以下之一:
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
| SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
有关 Postgres 锁的更多信息 here
添加选项
您可以使用Options
添加您想要的任何选项,这将出现在 Strength 之后。
db.Clauses(clause.Locking{
Strength: "UPDATE",
Options: "NOWAIT",
}).Find(&users)
// SELECT * FROM `users` FOR UPDATE NOWAIT
关于go - 我如何在 GORM(Golang) 中进行表锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72142999/