Golang数据库/SQL中的死锁 [英] Dead Lock in golang database/sql

查看:138
本文介绍了Golang数据库/SQL中的死锁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到Go的数据库/SQL包中有一个奇怪的行为,它使用lib/pq中的PostgreSQL驱动程序。基本上,如果我使用数据库连接进行查询,同时在同一连接上构建事务,我会进入死锁和程序块(我需要手动重新启动数据库服务器才能使其再次工作)。在下面的示例代码中,我将停留在SELECT语句上,并且永远不会执行第二个INSERT语句(而如果我删除查询,代码将正常执行)。

tx, _ := connection.Begin()
tx.Exec(insert_statement)
rows, _ := connection.Query(select_statement)
rows.Close()
tx.Exec(insert_statement_2)
tx.Commit()

这正常吗?我是否应该在每次要使用事务时创建新的数据库连接?

推荐答案

Connection.Query函数与您的tx.XXX函数不在同一会话上执行,因此,如果SELECT_STATEMENT恰好引用了INSERT_STATEMENT写入的任何内容,您可能会阻止。

尝试tx.Query(SELECT_STATEMENT)查看该语句是否阻塞。

这篇关于Golang数据库/SQL中的死锁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆