Postgresql Npgsql、TransactionScope和准备好的事务

Postgresql Npgsql、TransactionScope和准备好的事务,postgresql,transactions,prepared-statement,distributed-transactions,npgsql,Postgresql,Transactions,Prepared Statement,Distributed Transactions,Npgsql,有人能说我可以将npgsql与TransactionScope一起使用吗 在此手册中作为示例提供的代码:不起作用。它只是在服务器上创建两个准备好的事务 我的问题和这个问题一样: 在TransactionScope中使用npgsql有什么解决方案吗 UPD: 首先,我的目标是: 我需要在我的软件中的单个逻辑转换中使用两个连接。最好的解决方案是TransactionScope。Npgsql声明支持系统事务中的登记 然后我的麻烦来了: 我使用文档中的代码,此代码将执行以下操作: 创建事务范围 打开第一

有人能说我可以将npgsql与TransactionScope一起使用吗

在此手册中作为示例提供的代码:不起作用。它只是在服务器上创建两个准备好的事务

我的问题和这个问题一样:

在TransactionScope中使用npgsql有什么解决方案吗

UPD: 首先,我的目标是: 我需要在我的软件中的单个逻辑转换中使用两个连接。最好的解决方案是TransactionScope。Npgsql声明支持系统事务中的登记

然后我的麻烦来了: 我使用文档中的代码,此代码将执行以下操作:

  • 创建事务范围
  • 打开第一个连接
  • 打开第二个连接
  • 不要插入第一个连接
  • 不要插入第二个连接
  • 闭合第二连接素
  • 关闭第一个连接
  • 调用scope.Complete()
  • 处置范围
  • 我等待,9步之后数据将完全提交给db。事实上,在步骤6和7中,npgsql创建准备好的事务,而在步骤9中什么也不做。最后,我有两个预先准备好的事务,即块数据库。没有人可以提交或回滚它们

    通常,若我在范围上的调用完成之前关闭连接(例如,由于异常),npgsql将创建阻塞表的准备好的事务。我认为这不是一种拘谨的行为。我等待作用域dispose之后的数据将被完全提交或完全回滚。没有任何准备好的交易


    您可以使用文档中的代码重复此错误。参考Devart free library工作正确。

    在讨论答案之前,需要明确三个独立的概念

  • 有一些准备好的语句,它们与连接相关联,并提供一个“框架”语句,每次执行都可以插入新的值,而不必每次都解析和规划该语句。好的一面是,您可以节省每次执行时解析和规划语句所需的CPU时间。不利的一面是,计划是基于最佳“通用”计划进行的,对于所有可能分配的值来说,这不可能是最佳计划。准备好的语句由
    NpgsqlCommand.prepare()
    方法创建

  • 有些事务与连接关联,并为一组相关的数据库活动提供上下文。一个事务的所有活动都在一台服务器的一个数据库中。事务由
    NpgsqlConnection.BeginTransaction()
    方法创建

  • 有一些准备好的事务,它们使用两阶段提交(2PC)跨多个连接管理多个事务,可能在不同的连接、不同的数据库、不同的服务器上,或者使用完全不同的服务器产品作为一个逻辑“分布式事务”。此功能的使用应始终由高质量的事务管理器产品处理,该产品通常不属于参与分布式事务的任何数据库的一部分。目标是,当所有相关事务都完成了它们的工作时,事务管理器会告诉每个事务“准备”提交。在向事务管理器发出成功或失败指示之前,每个人都会尝试做所有可能导致其失败的事情。如果所有事务都在“准备”阶段成功,那么事务管理器将通知每个事务提交。准备好的事务必须能够在事务管理器请求时在稍后的某个时间提交,即使服务器在“准备”阶段成功传达给事务管理器后立即崩溃。似乎支持使用
    TransactionScope
    构造函数创建您自己的事务管理器我强烈建议不要尝试创建自己的临时事务管理器。事务管理器是一个复杂而微妙的软件,很难正确操作,如果操作不当,可能会产生严重的负面后果

  • 我的印象是,问题的目的是使用前两个特性,而不是第三个。如果这是真的,则使用了错误的方法来管理事务


    在参考文档页面中,有以合理方式使用交易和准备的报表的示例。名为System.Transactions的功能使用了
    TransactionScope
    类,它似乎不需要您去做您想做的事情,而且似乎是让您陷入麻烦的原因。请看仅使用
    conn.BeginTransaction()

    的示例,我不需要准备事务。npgsql驱动程序中存在问题。若我创建TransactionContext,那个么插入一些东西并抛出异常(不在TransactionContext上调用Complete),npgsql将在服务器上创建准备好的事务。此事务阻止表,并且没有人提交或回滚此事务。这是个问题,标题没问题。当我将事务与手册中的代码一起使用时(请参阅相关链接),npgsql驱动程序会创建准备好的事务。此事务阻塞表,无人提交\回滚它。我正在努力寻找解决方法。这是手册中的copypaste。您能澄清一下为什么需要跨两个连接的单个事务吗?(例如,它们是否在不同的服务器上?)此外,当处于问题状态时,您在
    SELECT*FROM pg_prepared_xacts
    上看到了什么?我看到了两个预处理的事务。我使用这个视图进行诊断。首先,thx为您提供答案。我将更新问题以更好地描述情况。添加一些额外的描述。它开始听起来像系统。npgsql的事务功能可能不完全稳定。如果您真的需要分布式事务,您可能需要研究不同的事务管理器产品,或者向支持该功能的人提出问题。Y