go - 我如何在 GORM(Golang) 中进行表锁定?

标签 go go-gorm

如何在 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/

相关文章:

go - 新运行的 for 循环是否结束上次运行的 for 循环的范围?

postgresql - Postgres外键上的删除约束

error-handling - 如何检测 gorm 中的连接失败?

GORM Golang 如何优化这段代码

go - Golang,在安装后导入pkg

google-app-engine - 如何使用 Go 的 dataStore 创建数据模型?

com - 从 Go 查询 WMI

data-structures - 在 Go 中使用 TTL 选项映射

go - Go GORM无法猜测嵌入式类型的关系

sql - 如何显示查询结果计数