遇到并发事务和SQL事务处理问题。我有下面(错误检查和这样为清楚起见移除)的(存根)代码:Golang并发SQL事务处理
dao, _ := sql.Open("postgres", args)
tx1 := dao.Begin()
res, _ := tx1.Exec("UPDATE <...>", args...)
// error check
tx2 := dao.Begin()
res, _ = tx2.Exec("UPDATE <same>", args...)
_ = tx1.Commit()
_ = tx2.Commit()
这发生一个单元测试中。这个想法是强制并发失败,因为两个Execs试图更新同一行,以确保给出正确的冲突错误响应。但是,第二个Exec会永久阻止。
据我所知,这种类型的阻塞只有在数据库不在数据库连接时才会发生,但事务都应该在自己的(独占)连接中运行,而且我没有设置一个最大的连接在任何地方(我也尝试将其设置为像100,没有影响)。
pq: could not serialize access due to concurrent update
我是否错过了某些东西关于golang的SQL包或postgres驱动程序如何处理连接池?为什么第二个事务Exec阻塞直到第一个事务被提交?是不是两人可以同时运行的交易点,以及哪个提交(或开始?)首先获胜?
2015-10-19 Kaedys
你对postgres使用什么包?我认为你的问题与我现在删除的答案一致,但是我的语言绝对是错误的。从'Open'返回的'* DB'对象可以用来管理多个连接,你的驱动程序可能有一个限制或者没有被设计为打开新的连接,每个驱动程序都有自己的实现,它们的列表可以是在这里找到; https://github.com/golang/go/wiki/SQLDrivers –
https://github.com/lib/pq 我查看了源代码,它似乎没有任何限制我可以找到。一般来说,鼓励司机让golang处理汇集,从我所知道的。 –
嗯我不知道,但如果你看看这里的来源,它似乎大部分的责任是在司机身上; https://golang.org/src/database/sql/sql.go?s=5752:6728#L211 –