Npgsql提供程序是否支持TransactionScope?

费德里科·奥兰迪尼(Federico Orlandini)

我正在尝试与Npgsql提供程序一起使用TransactionScope。我在一个古老的问题(.net中PostgreSQL的提供程序,支持TransactionScope)中发现Npgsql还不支持它。现在,大约5年后,Npgsql是否支持TransactionScope?我使用Npgsql 3.0.3并使用以下代码对自己进行了测试:

using (var scope = new TransactionScope())
{
    using(var connection = new Npgsql.NpgsqlConnection("server=localhost;user id=*****;password=*****database=test;CommandTimeout=0"))
    {
        connection.Open();

        var command = new NpgsqlCommand(@"insert into test.table1 values ('{10,20,30}', 2);");
        command.Connection = connection;
        var result = command.ExecuteNonQuery();

        // scope.Complete();  <-- Not committed
    }
}

任何人都可以确认Npgsql不支持TransactionScope吗?

编辑#1确认Npgsql对TransactionScope的支持后,我发现您需要确保在PostgreSQL配置中启用了分布式事务,请检查postgres.conf文件中max_prepared_transactions参数(记住要重新启动服务器) 。

编辑#2我在服务器上启用了分布式事务,但是现在在使用TransactionScope和Npgsql时出现错误。这是我的代码:

using (var sourceDbConnection = new NpgsqlConnection(SourceConnectionString))
using (var destinationDbConnection = new NpgsqlConnection(DestinationConnectionString))
using (var scope = new TransactionScope())
    {
        sourceDbConnection.Open();
        destinationDbConnection.Open();

        Logger.Info("Moving data for the {0} table.", TableName.ToUpper());
        var innerStopWatch = new Stopwatch();
        innerStopWatch.Start();

        foreach (var entity in entities)
        {
            var etlEntity = new EtlInfoItem
            {
                MigratedEntityId = category.RowId,
                ProjectId = category.ProjectId,
                ExecutionDatetime = DateTime.Now
            };

            // Insert into the destination database
            var isRowMigrated = InsertEntity(entity, DestinationSchema, destinationDbConnection);

            if (isRowMigrated)
            {
                // Update the ETL migration table
                InsertCompletedEtlMigrationEntity(etlEntity, EtlSchema, sourceDbConnection);
            }
            else
            {
                // Update the ETL migration table
                InsertFailedEtlMigrationEntity(etlEntity, EtlSchema, sourceDbConnection);
            }
        }

        Logger.Info("Data moved in {0} sec.", innerStopWatch.Elapsed);

        Logger.Info("Committing transaction to the source database");
                innerStopWatch.Restart();

        scope.Complete();

        innerStopWatch.Stop();
        Logger.Info("Transaction committed in {0} sec.", innerStopWatch.Elapsed);
    }

当TransactionScope从范围中退出时(退出using语句时),我得到一个带有以下堆栈跟踪的空引用异常:服务器堆栈跟踪:在Npgsql.Npgsql.NpgsqlConnector.Cleanup()在Npgsql.NpgsqlConnector.Break()处。 Npgsql.NpgsqlConnector.ReadExpectingT上的NpgsqlConnector.ReadSingleMessage(DataRowLoadingMode dataRowLoadingMode,Boolean returnNullForAsyncMessage).........它是随机发生的。

谢伊·罗扬斯基(Shay Rojansky)

Npgsql确实支持TransactionScope,并且已经支持了很长一段时间。但是,至少就目前而言,为了使您的连接参与TransactionScope,您必须:

  1. 包括Enlist=true在您的连接字符串中,或
  2. 呼叫NpgsqlConnection.EnlistTransaction

看一下有关此示例Npgsql单元测试

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

错误:-Microsoft.ACE.OLEDB.12.0提供程序不支持ITransactionLocal接口。是否有任何先决条件?

来自分类Dev

在Web应用程序中使用TransactionScope是否安全?

来自分类Dev

无法确定类型为'Npgsql.NpgsqlFactory'的提供程序工厂的提供程序名称。

来自分类Dev

Windows是否支持从内存运行程序?

来自分类Dev

Cloudfoundry路由器是否提供HTTPS支持?

来自分类Dev

Tomcat是否提供对Java 9 BETA的支持

来自分类Dev

mongodb是否已开始为社区版提供ssl支持?

来自分类Dev

Azure ACS是否支持OpenID Connect提供程序?

来自分类Dev

SQL Azure是否支持CLR程序集?

来自分类Dev

UWP应用程序是否支持Ajax?

来自分类Dev

Xamarin.forms中是否提供对DataTable的支持?

来自分类Dev

Npgsql支持哪些元组?

来自分类Dev

如何使Terraform提供程序支持导入?

来自分类Dev

Active Directory联合身份验证服务是否支持OpenID Connect声明提供程序

来自分类Dev

Npgsql错误-在Npgsql提供程序清单中找不到存储类型'nvarchar(MAX)'

来自分类Dev

使用Npgsql提供程序(.NET)执行SQL文件

来自分类Dev

如何知道C程序是否支持选项

来自分类Dev

对Parse和messageUI是否提供适当的支持?

来自分类Dev

bash是否提供使用指针的支持?

来自分类Dev

移动设备是否支持Chrome扩展程序?

来自分类Dev

Windows 8是否支持16位程序?

来自分类Dev

外壳程序是否支持递归?

来自分类Dev

Ubuntu是否支持Windows应用程序?

来自分类Dev

NpgSql数据提供程序中的NpgsqlTsVector / NpgsqlTsQuery可以用于全文搜索吗?

来自分类Dev

OpenID 2.0支持是否也为其他openId提供程序提供拒绝服务?

来自分类Dev

Ubuntu是否提供对满州语言的支持?

来自分类Dev

OpenSSL是否提供Big Decimal支持?

来自分类Dev

Windows 7是否支持Docker守护程序?

来自分类Dev

对Chrome扩展程序API是否提供支持?

Related 相关文章

  1. 1

    错误:-Microsoft.ACE.OLEDB.12.0提供程序不支持ITransactionLocal接口。是否有任何先决条件?

  2. 2

    在Web应用程序中使用TransactionScope是否安全?

  3. 3

    无法确定类型为'Npgsql.NpgsqlFactory'的提供程序工厂的提供程序名称。

  4. 4

    Windows是否支持从内存运行程序?

  5. 5

    Cloudfoundry路由器是否提供HTTPS支持?

  6. 6

    Tomcat是否提供对Java 9 BETA的支持

  7. 7

    mongodb是否已开始为社区版提供ssl支持?

  8. 8

    Azure ACS是否支持OpenID Connect提供程序?

  9. 9

    SQL Azure是否支持CLR程序集?

  10. 10

    UWP应用程序是否支持Ajax?

  11. 11

    Xamarin.forms中是否提供对DataTable的支持?

  12. 12

    Npgsql支持哪些元组?

  13. 13

    如何使Terraform提供程序支持导入?

  14. 14

    Active Directory联合身份验证服务是否支持OpenID Connect声明提供程序

  15. 15

    Npgsql错误-在Npgsql提供程序清单中找不到存储类型'nvarchar(MAX)'

  16. 16

    使用Npgsql提供程序(.NET)执行SQL文件

  17. 17

    如何知道C程序是否支持选项

  18. 18

    对Parse和messageUI是否提供适当的支持?

  19. 19

    bash是否提供使用指针的支持?

  20. 20

    移动设备是否支持Chrome扩展程序?

  21. 21

    Windows 8是否支持16位程序?

  22. 22

    外壳程序是否支持递归?

  23. 23

    Ubuntu是否支持Windows应用程序?

  24. 24

    NpgSql数据提供程序中的NpgsqlTsVector / NpgsqlTsQuery可以用于全文搜索吗?

  25. 25

    OpenID 2.0支持是否也为其他openId提供程序提供拒绝服务?

  26. 26

    Ubuntu是否提供对满州语言的支持?

  27. 27

    OpenSSL是否提供Big Decimal支持?

  28. 28

    Windows 7是否支持Docker守护程序?

  29. 29

    对Chrome扩展程序API是否提供支持?

热门标签

归档