事务内的多个Dapper Execute()语句引发NpgsqlTransaction已完成;它不再是可用的例外

问题描述 投票:1回答:1

我正在使用dapper和npgsql。 (.net core 3.1)

对于一个连接且在一个事务内的多个connection.Execute(query, params, transaction),最后调用This NpgsqlTransaction has completed; it is no longer usable.时抛出commit()异常。

在每个sql execute语句上都没有异常。

当我调试代码后,在第一次Execute()调用后,事务的IsCompleted属性设置为true

所以我不能在一个事务中多次运行Execute()?

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
                }
}

不使用交易时,一切正常,但我需要它

c# .net postgresql dapper npgsql
1个回答
0
投票

在创建连接之后并在创建事务之前自行添加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);
© www.soinside.com 2019 - 2024. All rights reserved.