MS SQL, Linked Server и транзакции
Экспериментировал с Linked Server-ом, который является ODBC источником.
Выяснил, что соединение с Linked Server-ом устанавливается и разрывается "за сценой" без вашего желания. Если в ходе явной транзакции соединение переустановилось, то та часть операций, которая была отправлена до восстановления соединения, выполнена не будет, а та часть, что отправлена после — будет (только часть!). Причем, если вы выполните ROLLBACK, он вам ничего не даст — переустановленное соединение не сохраняет транзакцию.
Проведем эксперимент.
1. На MySQL сервере, создадим БД с такой структурой:
CREATE TABLE `t1` (
`a` varchar(256) DEFAULT NULL,
`b` varchar(256) DEFAULT NULL
);
2. На MS SQL сервере настроим ODBC соединение с ним и создадим Linked Server с именем mysql к этому источнику.
3. Убедимся, что все работает. На MS SQL выполним:
exec ('select a, b from t1') at mysql;
Должно вернуть пустую таблицу.
4. Запустим на MS SQL в отладке следующий код:
DECLARE @c INT;
SET @c=0;
exec ('begin') at mysql;
WHILE @c < 10
BEGIN
exec ('insert into t1 values ("a","b")') at mysql;
SET @c=@c+1;
END
exec ('rollback') at mysql;
Прокрутим несколько итераций цикла.
5. Убедимся, другим MySQL клиентом, что в таблице ничего не появилось. Пока все правильно, ведь мы не закрыли транзакцию.
6. Рестартанем MySQL сервер (как будто произошел сбой).
7. Прокрутим ещё несколько итераций цикла.
8. Убедимся, другим MySQL клиентом, что в таблице стали появляться данные.
Упс!
P.S. Ещё немного камней в огород Linked Server в этой статье.