Go 语言连 SQL Server 的同学注意了,微软官方驱动 go-mssqldb 刚发布了 v1.10.0,这次更新干货不少,尤其是修了一个可能导致数据一致性问题的严重 Bug。
最重要的修复:XACT_ABORT 静默提交
如果你用过 SET XACT_ABORT ON,这条一定要看。
此前当 SQL Server 因 XACT_ABORT 中止事务后,驱动程序并不会感知到这个状态——连接还在,后续的 SQL 语句居然还能自动提交!这意味着你以为在事务保护下的操作,其实已经在事务边界之外悄悄执行了。
v1.10.0 终于修复了这个问题(#370)。现在驱动会正确检测服务器端中止的事务,尝试在已中止连接上执行操作时会明确返回错误,不再让你在不知不觉中踩坑。
国内很多金融、电商场景都在用 Go + SQL Server 的组合做核心业务,数据一致性至关重要,这个 Bug 修复建议尽快升级。
实现 DriverContext 接口
这是 Go 数据库驱动的一个标准接口,之前 go-mssqldb 一直没实现,导致一些现代用法用不了:
sql.OpenDB()方式创建连接SetConnMaxLifetime()、SetMaxOpenConns()等连接池配置
现在都支持了(#365),写法更规范,和 Go 社区的其他数据库驱动行为一致。
Rows.Close() 不再吞错误
以前 Rows.Close() 在清理 token 阶段遇到的服务器错误会被静默忽略(#361)。比如你在遍历结果集时遇到权限问题或约束冲突,Close 之后根本不知道出了错。现在这些错误会正确抛出,排查问题方便多了。
新增 Nullable 日期时间类型
Go 操作 SQL Server 的 datetime/smalldatetime 类型一直有点别扭,特别是处理 NULL 值的时候。v1.10.0 新增了三个类型(#325):
civil.NullDate— 可空日期civil.NullTime— 可空时间civil.NullDateTime— 可空日期时间
和 database/sql 的 Scanner/Valuer 接口完美集成,不用再写 *time.Time 那套 workaround 了。
其他值得关注的改动
- ARM64 Windows 上的命名管道协议支持(#232)— 国内用 ARM 服务器跑 Windows 的场景不多,但在 Azure 上有用
- 连接字符串错误信息不再泄露用户密码(#319)— 安全修复
FailoverPartnerSPN连接参数(#327)— Always On 高可用场景支持sql_variantscanType 返回修复(#362)— 之前扫描 variant 类型会返回 nil- DevContainer 开发环境(#317)— 打开仓库即开箱即用,方便贡献代码
升级方式
go get github.com/microsoft/go-mssqldb@v1.10.0
要求 Go 1.21+,支持 SQL Server 2012 ~ 2022 以及 Azure SQL Database。
📎 原文链接:https://techcommunity.microsoft.com/t5/sql-server-blog/go-mssqldb-v1-10-0-better-reliability-developer-experience-and/ba-p/4516487 📅 发布日期:2026-05-01


