Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions / 11 сообщений из 11, страница 1 из 1
27.01.2005, 21:57:09
    #32888143
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
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
27.01.2005, 22:24:04
    #32888171
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
SQLOLEDB провайдер не использует для начала транзакции BEGIN TRANSACTION .

cnn2.BeginTrans выставляет внутренний флажок, смысл которого - следующую команду предварить установкой set implicit_transactions on
соответственно после коммита или роллбэка при поступлении новой команды предварительно выполнится set implicit_transactions off, если конечно поведение не будет изменено атрибутами adXactAbortRetaining и adXactCommitRetaining. в случае указания этих атрибутов
set implicit_transactions off делаться не будет
...
Рейтинг: 0 / 0
27.01.2005, 22:45:16
    #32888192
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
Хм... А как тогда работать с транзакциями на 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
27.01.2005, 22:48:17
    #32888196
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
Поправка :
Код: 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
27.01.2005, 22:54:56
    #32888202
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
сам по себе conn.BeginTransaction не вызывает на сервере никаких действий, только флажки на клиентской стороне OLEDB

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

А задача то какая?
...
Рейтинг: 0 / 0
28.01.2005, 00:15:50
    #32888243
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
Задача-то провести серию транзакций, но я расчитывал, что они пойдут при
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
28.01.2005, 00:26:32
    #32888247
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
Уточнение - как определось @@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
28.01.2005, 02:13:55
    #32888264
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
Ну поехали, попытаюсь ещё раз. Логика растёт из совместимости с 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
28.01.2005, 15:35:02
    #32889647
yuniki
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
Да, спасибо, в общем режимы явная/автокоммит я понимаю, но вот малость запутался , в BOL глядя - там строит , что транзакция начинаяется с SELECT , ну я чей-то и поставил тот, что меня наиболее интересовал в текущий момент
Ну вот выясняется, что операторы д.б. DDL/DML. В общем-то логично, правда BOL опять же могла яснее изъясняться.

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

cnn.Begintrans
cnn.Begintrans

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


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