2014-10-27 71 views
2

Go对自动提交使用sql.DB,对于手动提交使用sql.Tx。这对于一次性使用来说不是问题。问题是我有一个框架,它使用sql.DB来完成数据库工作,现在我想让他们中的一些人加入我的新事务,并且如果不修改现有框架以接受sql.Tx,似乎并不那么容易。我想知道是否真的没有一种简单的方法来执行Go中的自动/手动切换?golang中的db交易

+0

@rightføld,我不认为我写的与Java比较是无关紧要的。这是我希望的。我应该修改其他人的帖子,至少我会得到该帖子的权威所有者的批准。 – 2014-10-27 18:59:35

+1

“一个框架” - 那是什么框架?知道这将有助于找到答案。还是它是你自己写的框架? – rob74 2014-10-28 08:52:12

+0

@ElgsQianChen来自Stack Overflow文档(http://stackoverflow.com/help/editing):“如果您对您的贡献由其他可信用户进行协作编辑的想法感到不满意,则这可能不适合您“。 – Topo 2014-10-28 18:07:43

回答

1

不知道更多关于您正在使用的框架,我不认为有没有办法做到这一点,而不修改框架。您应该真的尝试获取框架中包含的修改,因为这里的主要问题是您正在使用的框架设计不佳。在编写新语言(特别是图书馆或框架)时,您应该了解这些约定并相应地设计您的软件。

在旅途中,它不是很难完成这个功能,你只需要声明的是这样的Queryer(或者无论你怎么称呼它)接口:

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) 
} 

这个接口是由隐实施sql.DBsql.Tx所以在声明它之后,您只需修改函数/方法来接受Queryer类型而不是sql.DB

+0

我在Java中传递我的连接(* sql.DB),我可以让客户决定他们是否想要加入事务,但是在进行时,这似乎是不可能的,因为如果客户端决定加入一个事务,他们必须使用* sql.Tx而不是* sql.DB,因此,我的接口中断了。 – 2014-10-28 20:26:06

+1

@ElgsQianChen我不明白为什么界面打破了。有了这个接口,你可以将(Tx和DB)传递给一个函数或方法,它可以工作,但也许我不理解你的观点。 – Topo 2014-10-28 20:43:46

+0

谢谢@Topo,我最终将Tx和DB都传递给了我的函数。它的作品,但看起来不那么优雅。 – 2014-10-29 06:55:47