Hasty Briefsbeta

双语

I shipped a transaction bug, so I built a linter

7 days ago
  • #static-analysis
  • #database-transactions
  • #go-programming
  • 作者在事务边界之外意外泄露了数据库操作,引发了一个交易Bug,这导致了静默的数据损坏和竞态条件。
  • 该Bug发生在使用仓库模式结合回调的Go代码中:当混合使用不同作用域的仓库(例如在事务回调中使用s.repo而非tx)时,代码能正常编译并通过测试,但在高负载下会导致不可预测的故障。
  • 为了防止此类Bug,作者利用go/analysis框架开发了一个自定义的静态分析工具(linter),通过结构分析来检测像在事务回调中错误使用仓库变量这样的问题。
  • 这款名为transactioncheck的linter能够识别事务调用、追踪事务参数,并通过递归分析辅助函数来确保所有数据库操作都使用了事务作用域内的仓库。
  • 测试使用了analysistest,通过在测试文件中添加// want注释来验证诊断信息;该linter已集成到CI流程中,一旦发现违规就会中断构建,从而防止Bug进入生产环境。