事务中的多个 Dapper Execute() 语句抛出 NpgsqlTransaction 已完成;它不再可用异常
Multiple Dapper Execute() statements inside transaction throws NpgsqlTransaction has completed; it is no longer usable exception
我正在将 dapper 与 npgsql 一起使用。 (.net 核心 3.1)
多个 connection.Execute(query, params, transaction)
用于一个连接并且在一个事务内在最后调用 commit()
时抛出 This NpgsqlTransaction has completed; it is no longer usable.
异常。
每个 sql 执行语句都没有发生异常。
当我调试代码时注意到事务的 IsCompleted
属性 在第一次 Execute() 调用后设置为 true。
所以我无法 运行 在一次交易中多次执行()?
using (var connection = new NpgsqlConnection(_connectionString)) {
connection.Open();
using (var tr = connection.BeginTransaction()) {
foreach (var script in scripts)
{
try
{
connection.Execute(script.SqlQuery, script.Params);
}
catch (Exception e)
{
throw; //nothing crashes here
}
}
tr.Commit(); //NpgsqlTransaction has completed; it is no longer usable
}
}
不使用事务时一切正常,但我需要它
更新
感谢@Marc Gravell 指点我查看已执行的 sql 代码。
我有 DDL 脚本 CREATE TABLE IF NOT EXISTS Name (Column type); END;
。 END;
运算符在这里不是必需的,但它导致交易完成。
在创建连接之后和创建事务之前添加 connection.Open()
自己:
using (var connection = new NpgsqlConnection(_connectionString))
{
connection.Open();
using (var tr = connection.BeginTransaction())
{
通常 Dapper 会在内部处理这个问题,但如果您有多个必须在同一基础连接上的操作,它就不能。
另外:告诉 Dapper 有关交易的信息:
connection.Execute(script.SqlQuery, script.Params, transaction: tr);
我正在将 dapper 与 npgsql 一起使用。 (.net 核心 3.1)
多个 connection.Execute(query, params, transaction)
用于一个连接并且在一个事务内在最后调用 commit()
时抛出 This NpgsqlTransaction has completed; it is no longer usable.
异常。
每个 sql 执行语句都没有发生异常。
当我调试代码时注意到事务的 IsCompleted
属性 在第一次 Execute() 调用后设置为 true。
所以我无法 运行 在一次交易中多次执行()?
using (var connection = new NpgsqlConnection(_connectionString)) {
connection.Open();
using (var tr = connection.BeginTransaction()) {
foreach (var script in scripts)
{
try
{
connection.Execute(script.SqlQuery, script.Params);
}
catch (Exception e)
{
throw; //nothing crashes here
}
}
tr.Commit(); //NpgsqlTransaction has completed; it is no longer usable
}
}
不使用事务时一切正常,但我需要它
更新
感谢@Marc Gravell 指点我查看已执行的 sql 代码。
我有 DDL 脚本 CREATE TABLE IF NOT EXISTS Name (Column type); END;
。 END;
运算符在这里不是必需的,但它导致交易完成。
在创建连接之后和创建事务之前添加 connection.Open()
自己:
using (var connection = new NpgsqlConnection(_connectionString))
{
connection.Open();
using (var tr = connection.BeginTransaction())
{
通常 Dapper 会在内部处理这个问题,但如果您有多个必须在同一基础连接上的操作,它就不能。
另外:告诉 Dapper 有关交易的信息:
connection.Execute(script.SqlQuery, script.Params, transaction: tr);