消息7391:链接服务器无法启动分布式事务(两个svrs在本地运行)

时间:2016-09-10 17:20:17

标签: mysql sql-server msdtc

我在Win 10 PC上运行从SqlServer 2014到MySQL 5.7.3的LinkedServer。两者都选择&插入查询通过openquery单独工作,但插入查询在触发器中不起作用。请不要将此标记为重复,除非您找到了“治愈方法”。以下没有列出!

  

OLE DB提供程序" MSDASQL"对于链接服务器" MYSQL"返回消息" [MySQL] [ODBC 5.3(w)驱动程序]不支持可选功能"。

     

*消息7391,级别16,状态2,过程TRG_AfterEventInsert,第14行

     

无法执行操作,因为OLE DB提供程序" MSDASQL"对于链接服务器" MYSQL"无法开始分布式交易。

这方面有很多帖子,但我已经做了我能找到的所有事情,但它仍然没有成功。我发现了一个名为dtcping的MS实用程序,它首先失败,直到我翻转了注册表设置,但现在它成功了。

在DTC属性屏幕上,我启用了网络DTC管理,允许远程,允许输入/出站而无需身份验证和启用XA事务。在我的链接服务器上,我有rpc& rpc out = true和"启用DT"假。我将msdtc应用添加到防火墙排除项中。

我还尝试为我的LinkedServer禁用DTC,但这不起作用。我仍然得到错误。

有人可以在这里建议调试措施吗?我花了将近一整天没有成功。 MySQL驱动程序是5.3(32位)。

更新: dtcPing运行没有错误,但是当我尝试触发器插入时,我在dtctrace.log中看到以下内容

TRANSACTION_BEGUN RM_ENLISTED_IN_TRANSACTION"资源管理器#1001作为交易登记#1登记。 RM guid =' 57c2b4b4-f37a-4017-a1fc-2d95bd64693d'"

RECEIVED_ABORT_REQUEST_FROM_BEGINNER"收到了从初学者中止交易的请求"

TRANSACTION_ABORTING"交易正在中止"

3 个答案:

答案 0 :(得分:0)

你的意思是MySQL 5.3吗?当前手册显示的版本低至5.7,并且仅支持InnoDB存储引擎14.3.7 XA Transactions的分布式事务。

如果你已经检查了所有关于MySQL部分的内容,你是否在SQL Server端检查了不同类型的触发器?您是否正在使用不受支持的数据类型?

答案 1 :(得分:0)

  

"包含在触发器中的分布式查询,即使没有   事务明确指定,也被视为分布式   。交易"

support.microsoft.com/en-us/kb/274348

所以你需要使用DTC或使用Calling linked server from trigger

中的(2)

答案 2 :(得分:0)

创建触发器时,请使用以下构造来避免事务:


create trigger ti on t for insert, update as
begin

    COMMIT -- Commit FIRST to avoid DTC...
    insert into  [mysql]...[mysql.customers] (a,b) -- Do you work
    select  i, 'Test'
    from    inserted
    BEGIN TRAN -- Start tran again otherwise it will crash!!
end
go

请注意,“[mysql]...[mysql.customers]”语法,请求提供程序 MSDASQL 仅启用级别 0 设置(转到链接服务器并在提供程序上进行设置)。

但正如其他人所建议的那样,您最好直接从触发器中删除一份工作。

完整的测试代码:

---------------
-- Run on MYSQL...
---------------
CREATE TABLE customers (a INT, b CHAR (20), INDEX (a)) ENGINE=InnoDB;

---------------
-- Run on SQL Server
---------------
create table t (i int)

go

create trigger ti on t for insert, update as
begin

    COMMIT -- Commit tran to avoid DTC...
    insert into  [mysql]...[mysql.customers] (a,b)
    select  i, 'Test'
    from    inserted
    begin tran -- Start tran again otherwise it will crash!
end
go

insert into t (i) select 1

-- Verify results
select *
from [mysql]...[mysql.customers]