powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
11 сообщений из 11, страница 1 из 1
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888143
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADP & MsSQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function tu2()
Dim cnn2 As ADODB.Connection
Dim Cmd As New ADODB.Command
Dim Rs As New ADODB.Recordset
Dim param As Parameter

Set cnn2 = New ADODB.Connection
cnn2.ConnectionString = CurrentProject.BaseConnectionString
cnn2.CursorLocation = adUseServer
cnn2.IsolationLevel = adXactRepeatableRead
cnn2.Open   ' Здесь встает set implicit_transactions off ,...

cnn2.BeginTrans

cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText ' А Здесь уже встает set implicit_transactions on

Вопрос почему меняется set implicit_transactions на ON при первой после коннекта команде ?
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888171
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLOLEDB провайдер не использует для начала транзакции BEGIN TRANSACTION .

cnn2.BeginTrans выставляет внутренний флажок, смысл которого - следующую команду предварить установкой set implicit_transactions on
соответственно после коммита или роллбэка при поступлении новой команды предварительно выполнится set implicit_transactions off, если конечно поведение не будет изменено атрибутами adXactAbortRetaining и adXactCommitRetaining. в случае указания этих атрибутов
set implicit_transactions off делаться не будет
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888192
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... А как тогда работать с транзакциями на set implicit_transactions off ?

Так что-ли :
' пока стоит после открытия ' set implicit_transactions on
Cnn2.BeginTrans
cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText ' set implicit_transactions on
cnn2.CommitTrans ' чтобы сделать set implicit_transactions OFF

cnn2.BeginTrans ' дальше нормальная работа на OFF

cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText
...
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888196
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Хм... А как тогда работать с транзакциями на set implicit_transactions off ?

Так что-ли :
' пока стоит после открытия ' set implicit_transactions OFF
Cnn2.BeginTrans
cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText ' set implicit_transactions on
cnn2.CommitTrans ' чтобы сделать set implicit_transactions OFF

cnn2.BeginTrans ' дальше нормальная работа на OFF

cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText 

И вообще непонятно - зачем так сделано, ведь OLEDB устанавливает при подключении режим OFF ?
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888202
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сам по себе conn.BeginTransaction не вызывает на сервере никаких действий, только флажки на клиентской стороне OLEDB

Посмотри внимательно в профайлере
и особенно на эффект adXactAbortRetaining+adXactCommitRetaining

А задача то какая?
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888243
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача-то провести серию транзакций, но я расчитывал, что они пойдут при
set implicit_transactions off , раз провайдер при подключении его устанавливает,
Но теперь непонятно, зачем надо было переводить после begintrans режим на set implicit_transactions ON ,
Да и вообще как-то непонятно становится, как оновсе работает, например, как начнется новая транзакция, после COMMIT(ROLLBACK) старой , если он не отработает (ведь @@TRANCOUNT = 0) ? см. ниже :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Function tu2()
Dim cnn2 As ADODB.Connection
Dim Cmd As New ADODB.Command
Dim Rs As New ADODB.Recordset
Dim param As Parameter

Set cnn2 = New ADODB.Connection
cnn2.ConnectionString = CurrentProject.BaseConnectionString
cnn2.CursorLocation = adUseServer
cnn2.IsolationLevel = adXactRepeatableRead
cnn2.Open                                         '1) Здесь встает set implicit_transactions off ,...

cnn2.BeginTrans                                   '1.1) Здесь @@TRANCOUNT = 0
cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText '2) set implicit_transactions on
cnn2.RollbackTrans                                '3) IF @@TRANCOUNT > 0 ROLLBACK TRAN - но раз @@TRANCOUNT = 0, то НЕТ ROLLBACK !
cnn2.BeginTrans                                   '3.1) раз не было ROLLBACK новая транзакция в режиме implicit ON не начинается !
cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText
cnn2.CommitTrans                                  ' 4 ) IF @@TRANCOUNT >  0  COMMIT TRAN
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888247
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уточнение - как определось @@TRANCOUNT
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Function tu2()
Dim cnn2 As ADODB.Connection
Dim Cmd As New ADODB.Command
Dim Rs As New ADODB.Recordset
Dim param As Parameter

Set cnn2 = New ADODB.Connection
cnn2.ConnectionString = CurrentProject.BaseConnectionString
cnn2.CursorLocation = adUseServer
cnn2.IsolationLevel = adXactRepeatableRead
cnn2.Open                                         '1) Здесь встает set implicit_transactions off ,...

cnn2.BeginTrans                                   '1.1) Здесь @@TRANCOUNT = 0
cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText '2) set implicit_transactions on
Set Cmd.ActiveConnection = cnn2: Cmd.CommandType = adCmdText: Cmd.CommandText = "select @@TRANCOUNT"
Set Rs = Cmd.Execute
Debug.Print Rs( 0 )                                  ' ПОКАЗЫВАЕТ, ЧТО @@TRANCOUNT = 0  !!!
cnn2.RollbackTrans                                '3) IF @@TRANCOUNT > 0 ROLLBACK TRAN - но раз @@TRANCOUNT = 0, то НЕТ ROLLBACK !
cnn2.BeginTrans                                   '3.1) раз не было ROLLBACK новая транзакция в режиме implicit ON не начинается !
cnn2.Execute "select @@LOCK_TIMEOUT", , adCmdText
cnn2.CommitTrans                                  ' 4 ) IF @@TRANCOUNT >  0  COMMIT TRAN
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32888264
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну поехали, попытаюсь ещё раз. Логика растёт из совместимости с ODBC.

при открытии set implicit_transactions off

Conn.beginTrans ' ничего не происходит
Conn.execute "select @@LOCK_TIMEOUT" ' OLEDB, знает, что нужна транзакция,и делает set implicit_transactions on
' а потом select @@LOCK_TIMEOUT так как этот селект не оператор DML/DDL, то @@TRANCOUNT остаётся 0 !
Conn.Rollback ' OLEDB проверяет @@TRANCOUNT, он =0 ничего откатывать не надо!
Conn.BeginTrans ' implicit_transactions осталось on , ничего делать не надо
Conn.execute "select @@LOCK_TIMEOUT" ' опять не DML, @@TRANCOUNT остаётся 0
Conn.Committrans ' те же яйца, IF @@TRANCOUNT > 0 COMMIT TRAN - коммитить нечего.

А теперь замени "select @@LOCK_TIMEOUT " на DML оператор, например "SELECT * FROM dbo.syscolumns"
@@TRANCOUNT быстренько станет 1

авторНо теперь непонятно, зачем надо было переводить после begintrans режим на set implicit_transactions ON Для того чтобы не делать BEGIN TRANSACTION

Весело, да?

Если установить атрибут adXactCommitRetaining - после коммита OLEDB будет считать что начинается новая транзакция и щёлкать implicit_transactions в off при поступлении очередной команды не нужно. аналогично adXactAbortRetaining - после Rollback "начинается" новая транзакция.

Реальное начало транзакции происходит при исполнении первого DDL или DML оператора. Операции спеременными- не в счёт.

Вот поэтому господа из Микрософт сильно не рекомендуют явные BEGIN TRANSACTION, COMMIT и ROLLBACK

авторЗадача-то провести серию транзакций, но я расчитывал, что они пойдут при
set implicit_transactions off , раз провайдер при подключении его устанавливает,

Реальность такова, что в QLOLEDB транзакции начатые conn.beginTrans идут в implicit_transactions ON. Если нужно более тонкое управление транзакциями - скажи, помогу сочинить.
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32889647
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, спасибо, в общем режимы явная/автокоммит я понимаю, но вот малость запутался , в BOL глядя - там строит , что транзакция начинаяется с SELECT , ну я чей-то и поставил тот, что меня наиболее интересовал в текущий момент
Ну вот выясняется, что операторы д.б. DDL/DML. В общем-то логично, правда BOL опять же могла яснее изъясняться.

Если нужно более тонкое управление транзакциями - скажи, помогу сочинить.
Ну смотри, припомню.
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32889685
Alexey Sh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Я вчера BOL глянул и выматерился, по поводу того что SELECT как там написано начинает неявную транзакцию
...
Рейтинг: 0 / 0
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
    #32890086
yuniki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Sh >
Вот плиз посоветуй : как не запутаться с cnn.Begintrans :
Точнее как узнать , что она уже выдавалась, чтобы не было ошибки при такой последовательности команд :

cnn.Begintrans
cnn.Begintrans

желательно обойтись без on error resume next
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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