由于缺少 SessionResetter 和 Validator,在取消上下文时丢失事务的内存数据库

作者: mgabeler-lee-6rs创建于 2021年3月3日更新于 2025年6月22日

如果一个内存数据库在具有 `Context` 的事务中正在进行操作,而该上下文被取消,则整个内存数据库都将丢失。 什么?! 当事务以上下文形式打开时,将启动一个后台 goroutine,该 goroutine 会在上下文 `Done()` 后立即回滚事务: https://GitHub.com/golang/go/blob/release-branch.go1.16/src/database/sql/sql.go#L1786 如果该回滚操作触发,则会根据驱动是否实现了 `driver.SessionResetter` 和 `driver.Validator` 来有条件地关闭对应的连接: https://GitHub.com/golang/go/blob/release-branch.go1.16/src/database/sql/sql.go#L1764-L1766 由于本包没有实现这两个接口,因此每当对内存连接的事务由于上下文取消而回滚时,整个数据库都会丢失 ... 除非您打开了其他连接并使用了共享缓存模式。 但这种组合会导致无休止的"表已锁定"错误,因此通常会被避免。 我的猜测是,实现这些两个接口对于 SQLite 来说应该很容易。

内容来源: mattn/go-sqlite3