事务处置期间不可预测的 Npgsql 异常
本文关键字:Npgsql 异常 不可预测 事务处 | 更新日期: 2023-09-27 18:33:52
我正在尝试使用 Npgsql 2.1.3(Postgres v9.3(和 Dapper 1.29 在事务中运行一些命令,但偶尔会遇到一些意外的异常。 有时,代码工作正常。 其他时候,我收到以下异常:
Npgsql.NpgsqlException : ERROR: 57014: canceling statement due to user request
我的连接字符串是(我删除了用户 ID、密码和数据库(:
PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;
COMPATIBLE=2.1.3.0;HOST=127.0.0.1;USER ID=...;PASSWORD=...;DATABASE=...;SSLMODE=Require
下面是失败的代码示例(为简洁起见,忽略错误检查(:
var connection = new NpgsqlConnection(connectionString);
if (connection.State != ConnectionState.Open)
connection.Open();
IDbTransaction transaction = connection.BeginTransaction(
IsolationLevel.RepeatableRead);
try {
...
// Select some stuff using the connection underlying the transaction
var query = "SELECT * FROM ...";
var result = connection.Query<MyType>(query, dynamicParams, transaction).ToList();
...
// Perform an insert using the same command indicated above
query = "INSERT INTO ... (...) VALUES (...) RETURNING *";
var result2 = connection.Query<MyType2>(query, dynamicParams, transaction).FirstOrDefault();
...
// Delete the entry added above
query = "DELETE FROM ... WHERE id = :id";
var result3 = connection.Query<long>(query, dynamicParams, transaction).FirstOrDefault();
// I Don't explicitly call transaction.Rollback(),
// but I have tried that and it has no effect on the outcome
} finally {
// Note that if I put Thread.Sleep(1000) here, I never get the exception
transaction.Dispose(); // Npgsql.NpgsqlException (sometimes)
connection.Dispose();
}
有谁知道为什么上面的代码会对我反复失败? 我已经验证了我的任何连接调用都没有。查询<>引发异常。 另外,当我在事务之前放置一个 Thread.Sleep(( 命令时。Dispose((,异常永远不会发生。 似乎有一些异步代码被调用来读取 Rollback(( 的响应,这是在事务被释放并因此引发异常之后发生的。 我已经查看了NpgsqlConnection和NpgsqlTransaction的所有属性,它们似乎都没有指示Rollback((的结果是否已被读取。 我会继续研究它,但任何额外的帮助都非常感谢。
对于遇到此问题的任何其他人:更新到 Npgsql 2。2.3(从 2.1.3( 修复了该问题。 我在 Npgsql 发行说明中没有看到任何似乎相关的修复程序,但显然发生了一些变化,修复了故障。