mysql - 消息 7391 : linked server unable to begin a distributed transaction (both svrs running locally)

标签 mysql sql-server msdtc

我在我的 Win 10 PC 上设置了一个从 SqlServer 2014 到 MySQL 5.7.3 的 LinkedServer。选择和插入查询都可以通过 openquery 单独工作,但插入查询不会在触发器中运行。请不要将此标记为重复,除非您找到下面未列出的“治疗方法”!

OLE DB provider "MSDASQL" for linked server "MYSQL" returned message "[MySQL][ODBC 5.3(w) Driver]Optional feature not supported".

*Msg 7391, Level 16, State 2, Procedure TRG_AfterEventInsert, Line 14

The operation could not be performed because OLE DB provider "MSDASQL" for linked server "MYSQL" was unable to begin a distributed transaction.

关于这个的帖子有很多,但我已经做了我能找到的一切,但仍然无法正常工作。我发现了一个名为 dtcping 的 MS 实用程序,它起初失败,直到我翻转注册表设置,但现在它成功了。

在 DTC 属性屏幕上,我启用了网络 DTC 管理、允许远程、允许无需身份验证的输入/出站和启用 XA 事务。在我的链接服务器上,我有 rpc & rpc out = true 和“enable promotion of DT” false。我将 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 "交易正在中止"

最佳答案

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


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]

关于mysql - 消息 7391 : linked server unable to begin a distributed transaction (both svrs running locally),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428652/

相关文章:

sql - 检查整数是否在一系列列值之间

sql - 从 SQL Server 获取数据库用户列表及其权限

sql-server - 如何在不批量和使用 ASP 的情况下在 SQL Server 中插入 blob?

c# - 在现有 SqlConnection 中打开 DbContext 连接

java - 超过锁定等待超时;尝试重启事务

mysql - 如何在不使用多个 OR 条件的情况下搜索单个 MySQL 表的多个字段?

php - 找到出现次数最多的值并按其排序

mysql - 具有多个 IF 语句的 ON DUPLICATE KEY UPDATE

nhibernate - NServiceBus和NHibernate-消息处理程序和事务

c# - RegistryKey Key.GetValue ("keyName") 在单元测试 c# 项目中返回错误值