Распределенная транзакция на связанном сервере между 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 невозможно запустить распределенную транзакцию.
то, что я пробовал до сих пор.
включить транзакции XA в MSDTC
-
включен следующий параметр в связанном поставщике сервера
- вложенные запросы
- только нулевой уровень
- разрешить inprocess
- Поддерживает", Как " Оператор
Я проверил следующие ссылки и их предложения, однако ошибка сохраняется:
распределенные транзакции между MySQL и MSSQL
взаимодействие SQL-Server и MySQL?
синхронизация SQL Server и MySQL
редактировать
Дополнительная Информация:
MySQL использует InnoDB storage engine на машине Ubuntu.
Я уже настроил разъем ODBC и использовал его для настройки системного источника данных ODBC, который используется в связанном сервере
2 ответов
теоретически это должно работать.
Я бы предложил различные шаги, чтобы разобраться с этим:
вы уже проверили движок хранения MySql? Он выглядит только InnoDB поддержка механизма хранения распределяет транзакцию на документ MySql:https://dev.mysql.com/doc/refman/5.7/en/xa.html
см., если вы можете переключиться на использование MySQL Connectors setup connection для подключения к MySql в SQL Server вместо поставщика OLEDB, какое состояние документом MySql выше, что поддержка распределяет транзакцию.
Если все еще не работает, это может быть 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