php小编鱼仔在这里为大家解答一个常见的问题:"go goose 事务什么时候提交?"在 Go 语言中,事务的提交取决于具体的数据库驱动。一般而言,当执行事务提交的操作时,数据库会将当前事务的所有修改操作一次性提交到数据库中。这样可以确保事务的原子性,即要么全部提交成功,要么全部回滚失败。因此,事务的提交时机是在执行事务提交操作的时候,而不是在事务的开始或结束时。具体的使用方法可以参考相关的数据库驱动文档。
问题内容
- 我有一些代码需要在
tx
中运行,如下所示 - 我生成了一个 go sql 迁移,如
go goose
的官方文档中所述
我的问题是:
- 这些事务什么时候真正被
commited
到数据库? - 我强制使用
tx.commit()
提交迁移。这是我在 go 中的迁移文件:
func Up00002(tx *sql.Tx) error {
_, err := tx.Exec("UPDATE users SET username='admin' WHERE username='root';")
if err != nil {
return err
}
if err = tx.Commit(); err != nil {
return fmt.Errorf("error during committing the transaction: %w", err)
}
return nil
}
我无法在 down
部分之后运行上述迁移,因为当我运行它们时,我得到了 errtxdone
(源)。我仍然想多次运行 go 迁移 up00002
(用于测试)。我怎样才能做到这一点?我在这里做错了什么?
解决方法
因此,只需浏览他们的文档此处即可显示提交已经在 AddMigrations
调用中发生 - 这是使用 ofc 事务,由 go goose
内部处理 - 非常好:)
对于sql也是如此,正如我们所看到的这里
pkg还提供了--no-transaction
选项,我们可以使用它来完全控制db
对象 - 太棒了!