Распределенная транзакция на связанном сервере между sql server и mysql

у меня за столом говорят Table1 на SQL Server 2014 и MySQL оба.

Table1
ID INT,Code VARCHAR(100)

Я создал связанный сервер MyLinkedServer в SQL Server с помощью "поставщика Microsoft OLEDB для ODBC".

**Связанный Сервер **

EXEC master.dbo.sp_addlinkedserver @server = N'MyLinkedServer', @srvproduct=N'MyLinkedServer', @provider=N'MSDASQL', @datasrc=N'MyLinkedServer'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MyLinkedServer',@useself=N'False',@locallogin=NULL,@rmtuser=N'username',@rmtpassword='########'

Общие Настройки Сервера

EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer', @optname=N'remote proc transaction promotion', @optvalue=N'true'

связанный сервер создан успешно, и я могу запросить таблицу Mysql в SQL Server.

запрос

Когда Я запустить

INSERT INTO MyLinkedServer...Table1(ID,Code) SELECT 1,'Code1'

запись вставляется. Однако, когда я запускаю транзакцию и запускаю INSERT, Я получаю сообщение об ошибке:

BEGIN TRAN
INSERT INTO MyLinkedServer...Table1(ID,Code) SELECT 1,'Code1'
COMMIT

ошибка:

поставщик OLE DB " MSDASQL "для связанного сервера" MyLinkedServer "возвратил сообщение"[MySQL][драйвер ODBC 5.3(a)] дополнительная функция не поддерживается". Msg 7391, Уровень 16, Состояние 2, Строка 8 Не удалось выполнить операцию, так как поставщик OLE DB "MSDASQL" для связанного сервера" MyLinkedServer невозможно запустить распределенную транзакцию.

то, что я пробовал до сих пор.

  1. включить транзакции XA в MSDTC

  2. включен следующий параметр в связанном поставщике сервера

    • вложенные запросы
    • только нулевой уровень
    • разрешить inprocess
    • Поддерживает", Как " Оператор

Я проверил следующие ссылки и их предложения, однако ошибка сохраняется:

распределенные транзакции между MySQL и MSSQL

взаимодействие SQL-Server и MySQL?

синхронизация SQL Server и MySQL

редактировать

Дополнительная Информация:

  • MySQL использует InnoDB storage engine на машине Ubuntu.

  • Я уже настроил разъем ODBC и использовал его для настройки системного источника данных ODBC, который используется в связанном сервере

2 ответов


теоретически это должно работать.

Я бы предложил различные шаги, чтобы разобраться с этим:

  1. вы уже проверили движок хранения MySql? Он выглядит только InnoDB поддержка механизма хранения распределяет транзакцию на документ MySql:https://dev.mysql.com/doc/refman/5.7/en/xa.html

  2. см., если вы можете переключиться на использование MySQL Connectors setup connection для подключения к MySql в SQL Server вместо поставщика OLEDB, какое состояние документом MySql выше, что поддержка распределяет транзакцию.

  3. Если все еще не работает, это может быть msdtc служба сама по себе имеет какой-то проблемы, посмотреть, если вы можете изолировать как сделать сервер SQL экземпляр работает на MySQL сервер окно(если вы используете Windows с MySQL), или попробовать установить Windows MySQL на SQL-сервер, чтобы распределить операции между двумя СУБД MySQL. Который мог бы указать вам на фактическое проблема.

EDIT:

к сожалению, похоже, что вы доказали, что это не работает, я более внимательно смотрю на документ MySql и сожалею, что он выглядит, что я не читал его тщательно, он говорит:

В настоящее время, среди соединителей MySQL, mysql Connector/J 5.0.0 и выше поддерживает XA напрямую

и каким-то другим Гуглом я нашел это:https://bugs.mysql.com/bug.php?id=37283, люди об этой ошибке много лет назад, и они отмеченный это как не исправить.

какой-то один предложил что-то здесь: https://social.msdn.microsoft.com/Forums/en-US/fc07937d-8b42-43da-8c75-3a4966ab95f9/xa-msdtc?forum=windowstransactionsprogramming, что для реализации собственного XA-совместимый ресурс менеджеров быть использованы приложения (https://msdn.microsoft.com/en-us/library/ms684317.aspx)


Как и в SQL 2014, вы могли бы настроить связанный сервер не для включения в распределенную транзакцию. Хотя вы можете попробовать добавить "Enlist=false" в аргумент @provstr в sp_addlinkedserver