阿猫的博客

阿猫的博客

ORM 框架中为什么需要默认启用事务

Go
560
2023-06-07

背景

发现很多 ORM 框架都有 auto-commit 的配置,在执行任意写操作时,实际上都会开一个事务,然后自动提交。针对 GORM 框架深究了一下。

框架的行为

根据文档 Transactions | GORM - The fantastic ORM library for Golang, aims to be developer friendly.,GORM 框架会对写操作(create/update/delete)默认开启事务来保证数据一致性。这个行为可以通过配置全局禁用或者在单个操作中手动禁用。

// Globally disable
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  SkipDefaultTransaction: true,
})

// Continuous session mode
tx := db.Session(&Session{SkipDefaultTransaction: true})
tx.First(&user, 1)
tx.Find(&users)
tx.Model(&user).Update("Age", 18)

why?

找到一个比较靠谱的说法:why GORM perform single create, update, delete operations in transactions by default ? · Issue #5969 · go-gorm/gorm · GitHub

ORM 框架通常提供了一些逻辑层面的 API,例如批量插入、更新等,用户层面可能只是一个 update 操作,但实际上执行了多条 sql,用户不一定意识到这个问题,因此默认开启事务是更优解。