database - golang 中的数据库事务

标签 database transactions go

在 Java 中,很容易在数据库事务的自动提交和手动提交之间切换。当我说简单时,我的意思是它不需要更改连接接口(interface)。只需将 AutoCommit 设置为 true 或 false 即可在自动/手动模式之间切换事务。但是,Go 使用不同的连接接口(interface),sql.DB 用于自动模式,而 sql.Tx 用于手动模式。一次性使用不是问题。问题是我有一个使用 sql.DB 来做数据库工作的框架,现在我想让它们中的一些加入我的新事务,如果不修改现有框架来接受 sql.Tx 似乎并不那么容易。我想知道是否真的没有一种简单的方法可以在 Go 中进行自动/手动切换?

最佳答案

在不了解您使用的框架的更多信息的情况下,我认为没有办法在不修改框架的情况下做到这一点。您真的应该尝试将所做的修改包含在框架中,因为这里的主要问题是您使用的框架设计不佳。在为一种新语言(特别是库或框架)编写代码时,您应该了解约定并相应地设计您的软件。

在 go 中,实现此功能并不难,您只需像这样声明 Queryer(或者您想要调用它的任何方式)接口(interface):

type Queryer interface {
    Query(string, ...interface{}) (*sql.Rows, error)
    QueryRow(string, ...interface{}) *sql.Row
    Prepare(string) (*sql.Stmt, error)
    Exec(string, ...interface{}) (sql.Result, error)
}

此接口(interface)由 sql.DBsql.Tx 隐式实现,因此在声明它之后,您只需修改函数/方法以接受 Queryer 类型而不是 sql.DB

关于database - golang 中的数据库事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26593867/

相关文章:

http - 将 HTTP JSON 正文响应转换为 Go 中的映射

go - 如何构建 thrift4go?

sql - 如何知道我有多少条未读的群消息

ios - CoreData - 具有优先级的多对多关系

mysql - 查找 AM Times 并更新?

sql事务多个类vb.net

java - Spring 中的声明式事务管理行为不可预测

java - 如何在 Spring Web 应用程序中实现共享功能?

php - 我怎么知道 Laravel 中的交易是否顺利?

go - 具有相对路径的包布局