powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
12 сообщений из 12, страница 1 из 1
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978339
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, приветствую!

Обнаружил не понятное мне поведение ADODB.Connection.BeginTrans в части транзакций.
Никак не могу понять, в чём дело.

Есть тестовый код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
   Cnn: OleVariant;
begin
   Cnn := CreateOleObject('ADODB.Connection');

   Cnn.Open('Provider=SQLOLEDB;Server=tim-10\sql2012;Database=Master;Trusted_Connection=Yes');
//   Cnn.Open('Provider=MSOLEDBSQL;Server=tim-10\sql2012;Database='+cDBName+';Trusted_Connection=Yes');
//   Cnn.Open('Provider=SQLNCLI11;Server=tim-10\sql2012;Database='+cDBName+';Trusted_Connection=Yes');

   cnn.BeginTrans;
   cnn.Execute('select top 1 * from sys.all_views');
   cnn.CommitTrans;
   cnn.Close;
end;



Для SQLOLEDB выдача в профайлере MSSQL сервера (версия 11.0.2100.60) такая:
set implicit_transactions on
go
select top 1 * from sys.all_views
go
IF @@TRANCOUNT > 0 COMMIT TRAN
go

И это правильно, т.к. ADODB так работает с транзакциями - через set implicit_transactions on.

А для MSOLEDBSQL и SQLNCLI11 такая:
select top 1 * from sys.all_views
И это не верно - транзакции вообще нет!

С чем это может быть связано? Может, параметры MSOLEDBSQL и SQLNCLI11?

Благодарю!
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978365
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если писать так ?
Код: pascal
1.
cnn.Execute('begin tran; select top 1 * from sys.all_views; commit tran;');
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978370
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,

Ну это понятно, что можно.

Но дело в том, что
Код: plaintext
ADODB.Connection.BeginTrans
принципиально работает через
Код: plaintext
set implicit_transactions on
. Это данность, которую поменять (как я думал) нельзя.

Повайдер MSOLEDBSQL я только планирую использовать. Начал тестировать с ним, понял, что
Код: plaintext
ADODB.Connection.BeginTrans
для MSOLEDBSQL вообще "забивает" на транзакцию.

Вот и озадачился...

Возможно параметры провайдера MSOLEDBSQL надо как-то задавать в
Код: plaintext
ConnctionString
.
Но порыв интернет, ничего не нашел по этому поводу.

Обращаюсь к сообществу. Может, кто-то сталкивался с подобным.
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978378
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На всякий случай обновил сервер до 11.0.7001.0 отсюда https://www.microsoft.com/ru-RU/download/details.aspx?id=56040

Эффект нулевой.
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978388
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry TimokhovС чем это может быть связано?

Очевидно с тем, что MS SQL так и не научился в транзакции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978394
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: У тебя внутри транзакции ровно один запрос да и тот select. В этом случае транзакция не имеет смысла вообще, поэтому хитрый драйвер её и не стартует. Дай ему хотя бы два запроса, причём DML. Или используй TIL отличный от умолчательного dirty read.
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978399
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

В том то и дело, что всё это я уже проверил.
1. Даже по BOL при implicit_transations ON даже обычный select поднимает транзакцию (неявную).
2. В любом случае должен быть вызов implicit_transations ON. Его нет.
3. Вот ниже пример

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
   Cnn: OleVariant;
begin
   Cnn := CreateOleObject('ADODB.Connection');
   Cnn.Open('Provider=MSOLEDBSQL;Server=tim-10\sql2012;Database='+cDBName+';Trusted_Connection=Yes');
   cnn.Execute('create table _test (i int)');
   cnn.IsolationLevel := $00100000;
   cnn.BeginTrans;
   cnn.Execute('insert _test values(123)');
   cnn.Execute('insert _test values(123)');
   cnn.CommitTrans;
   cnn.Execute('drop table _test');
   cnn.Close;
end;



А это выдача профайлера:
create table _test (i int)
go
insert _test values(123)
go
insert _test values(123)
go
drop table _test
go


В общем, есть у меня ощущение, что у меня что-то поломалось в компьютере.
Понять бы, что именно.
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978403
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хммм... Странно. А если попробовать инсерты отроллбэчить?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978446
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Все пробовал: у меня MSOLEDBSQL (как и SQLNCLI11) полностью "кладут" на транзакции.
А OLEDBSQL работает верно.

В том то и дело, что странно.

Я хотел MSOLEDBSQL заюзать еще полгода назад. Тогда плотно его тестировал. Не могу поверить, что я пропустил, что тогда он тоже не делал транзакций.

Т.е. такое ощущение, что у меня именно перестали работать транзакции в MSOLEDBSQL. Может какая-то настройка сбилась. Но интернет молчит, что такое вообще возможно.
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978447
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Дмитрий, а можете код проверить для MSOLEDBSQL (или SQLNCLI11)?
В логе, что будет?
Как у меня или всё же будет работа с транзакциями?
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978450
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, если нет времени с дельфи возиться, то есть VBScript
Кому не сложно, просто его запустите (я просто в проводнике на него кликаю) - что будет в логах? Будет работа с транзакциями?

Спасибо!

ЗЫ Только имя сервера поправить надо.
...
Рейтинг: 0 / 0
Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
    #39978487
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ложечки нашлись, но осадочек остался.

В общем, BEGIN TRAN, COMMIT и ROLLBACK таки есть - в профайлере надо было настроить секцию Transactions (вторая с конца).

Но (тот самый осадочек)!

При использовании SQLOLEDB код:
Код: plaintext
1.
2.
3.
4.
cnn.IsolationLevel = adXactSerializable
cnn.BeginTrans
...
cnn.Commit


дает такой результат:
Код: plaintext
1.
2.
3.
4.
5.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
set implicit_transactions on 
...
IF @@TRANCOUNT > 0 COMMIT TRAN
 SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

Т.е. автоматом TIL восстанавливался до значения по умолчанию в MSSQL - READ COMMITTED.

При использовании MSOLEDBSQL тот же самый код дает уже такой вывод:
Код: plaintext
1.
2.
3.
BEGIN TRANSACTION
...
COMMIT TRANSACTION 

Тут явно не ставится TIL. Хотя при анализе transaction_isolation_level таблицы sys.dm_exec_sessions видно, что TIL меняется. Но! В чем самое плохое - после cnn.CommitTrans TIL не меняется автоматом в READ COMMITTED. Понимаю, что, возможно, это даже логично - не менять неявно TIL. Но! TIL реально меняется только в одном случае - при вызове cnn.BeginTrans. Что? Мне еще раз вызывать cnn.BeginTrans/cnn.CommitTrans, чтобы сменить TIL? Бред, имхо.

Тогда вопрос возникает, как в ADODB вообще правильно менять TIL?
Или никто этого не делает с клиента?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Разница провайдеров SQLOLEDB, MSOLEDBSQL и SQLNCLI11 по работе с транзакциями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]