AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 139740
Accepted
Dina
Dina
Asked: 2016-05-28 07:20:03 +0800 CST2016-05-28 07:20:03 +0800 CST 2016-05-28 07:20:03 +0800 CST

链接服务器“[name]”的 OLE DB 提供程序“MSDASQL”无法开始分布式事务

  • 772

我有一个从 SQL Server Ent 2012 到 PostgreSQL 9.3 的链接服务器设置和一个存储过程,从中提取 3 个过滤表并将每个表存储在一个临时表中。

在存储过程的末尾有一个带有许多左连接的最终查询,来自本地 SQL 数据库,它包括这 3 个临时表。
我已禁用“为 RPC 启用分布式事务的推广”。使用此存储过程的每 1/6 次或更多尝试都会失败,Web 服务器 Unknown Error Detected System.Data.SqlClient.SqlException (0x80131904): The operation could not be performed because OLE DB provider "MSDASQL" for linked server "POSTGRESQL" was unable to begin a distributed transaction. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection 上的错误为: SQL Server 上没有错误。

链接服务器定义:

EXEC master.dbo.sp_addlinkedserver @server = N'POSTGRESQL', @srvproduct=N'PostgreSQL', @provider=N'MSDASQL', @datasrc=N'PostgreSQL'
 EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'POSTGRESQL',@useself=N'False',@locallogin=NULL,@rmtuser=N'xxxxxx',@rmtpassword='xxxxx'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'collation compatible', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'dist', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'pub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'rpc', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'rpc out', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'sub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'connect timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'collation name', @optvalue=null
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'lazy schema validation', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'query timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'POSTGRESQL', @optname=N'remote proc transaction promotion', @optvalue=N'false'

存储过程/查询 (非常简化抱歉)

ALTER PROCEDURE [dbo].[SP_Name]
@DateFrom DATETIME,
@DateTo DATETIME

AS

DECLARE @variableB int

SET @variableB= {some criteria} 

IF (@variableB < 1000)

BEGIN
-- Passthrough to PG for a filtered table, instead of entire table grabbed via open query
    IF OBJECT_ID('tempdb.dbo.#temp_table1', 'U') IS NOT NULL
      DROP TABLE #temp_table1; 

    create table #temp_table1 (column1 int, column2 varchar(60))

    DECLARE @TSQL varchar(max)
    SET  @TSQL = 'select c1, c2 from OpenQuery([POSTGRESQL],''
            select c1, c2 from table1 t where 
            t.date>=''''' +CONVERT(VARCHAR(15),@DateFrom,102)+ '''''' + 't.date <=''''' +CONVERT(VARCHAR(15),@DateTo,102) + '''''' +'order by c1'')'

    insert into #temp_table1
    EXEC (@TSQL)

    create clustered index temp_index1 on #temp_table1 
    (column1 asc)
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]

-- 2nd table passthrough to PG for a filtered table, instead of entire table grabbed via open query
    IF OBJECT_ID('tempdb.dbo.#temp_table2', 'U') IS NOT NULL
      DROP TABLE temp_table2; 

    create table #temp_table2 (column1 int, column2 varchar(60), column3 int)

    SET  @TSQL = 'select a, b, c from OpenQuery([POSTGRESQL],''
            select a, b, c from table2 t where 
            t.date>=''''' +CONVERT(VARCHAR(15),@DateFrom,102)+ '''''' + 't.date <=''''' +CONVERT(VARCHAR(15),@DateTo,102) + '''''' +'order by a'')'

    insert into #temp_table2
    EXEC (@TSQL)

-- 3rd table passthrough to PG for a filtered table, instead of entire table grabbed via open query
    IF OBJECT_ID('tempdb.dbo.#temp_table3', 'U') IS NOT NULL
      DROP TABLE temp_table3; 

    create table #temp_table3 (column1 int, column2 varchar(60))

    SET  @TSQL = 'select a1, a2, a3 from OpenQuery([POSTGRESQL],''
            select a1, a2, a3 
            from
            table3 t
            where 
            t.date>=''''' +CONVERT(VARCHAR(15),@DateFrom,102)+ '''''' + 't.date <=''''' +CONVERT(VARCHAR(15),@DateTo,102) + ''''''
{plus other filtering criteria} +'order by a1'')'

    insert into #temp_table2
    EXEC (@TSQL)

IF (@variableB < 1000)

BEGIN

select {many columns}
from {various local tables with left joins}
left join #temp_table1 on {conditions}
left join #temp_table2 on {conditions}
left join #temp_table3 on {conditions}

END

本地 DTC 属性

在此处输入图像描述

  • 我认为正在发生的是,临时表中的 3 个开放查询正在分发,并且不知何故这不起作用。我承认我不太明白这一点——这超出了我的想象。我也知道启用“为 RPC 启用分布式事务的提升”会使失败更频繁地发生。
  • 这再次工作了 5/6 次,失败了大约 1/6 次。所以我不确定发生了什么。
  • 这是 PostgreSQL 上的只读事务 - 我不确定为什么要调用分布式事务。

编辑我在这里 看到这个问题,并认为我不应该遇到这个问题。

编辑 2 我可能在这里发现了一个重复的问题。

linked-server msdtc
  • 1 1 个回答
  • 5766 Views

1 个回答

  • Voted
  1. Best Answer
    Dina
    2016-06-01T06:12:29+08:002016-06-01T06:12:29+08:00

    使用 ISOLATION LEVEL READ UNCOMMITTED 将 3 个临时表插入包装在一个事务中似乎已经停止升级到分布式事务并解决了我的间歇性问题。

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    BEGIN TRANSACTION;
    
        DECLARE @TSQL varchar(max)
        SET  @TSQL = 'select c1, c2 from OpenQuery([POSTGRESQL],''
                select c1, c2 from table1 t where 
                t.date>=''''' +CONVERT(VARCHAR(15),@DateFrom,102)+ '''''' + 't.date <=''''' +CONVERT(VARCHAR(15),@DateTo,102) + '''''' +'order by c1'')'
    
        insert into #temp_table1
        EXEC (@TSQL)
    
    .....etc
    
    COMMIT TRANSACTION;
    

    这是一个重复的问题,最终给了我解决方案。也许,PostgreSQL ODBC 不支持分布式事务 - 由于 ACID 功能,在尝试使用临时表或尝试连接到远程数据库 3 次时,在链接服务器属性上禁用它们是不够的。

    • 2

相关问题

  • 在视图中是否可以隐式而不是显式地引用链接服务器?

  • 哪种报告方法性能更好,使用链接服务器还是使用 SSRS 中的查找?

  • 本地登录模拟不适用于链接服务器

  • 从多个链接的远程数据库中查询数据

  • 使用 VFPOLEDB 提供程序链接服务器时出现“链接服务器不包含表”错误

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve