|
|
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
ADP & MsSQL Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Вопрос почему меняется set implicit_transactions на ON при первой после коннекта команде ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 21:57:09 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
SQLOLEDB провайдер не использует для начала транзакции BEGIN TRANSACTION . cnn2.BeginTrans выставляет внутренний флажок, смысл которого - следующую команду предварить установкой set implicit_transactions on соответственно после коммита или роллбэка при поступлении новой команды предварительно выполнится set implicit_transactions off, если конечно поведение не будет изменено атрибутами adXactAbortRetaining и adXactCommitRetaining. в случае указания этих атрибутов set implicit_transactions off делаться не будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 22:24:04 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Хм... А как тогда работать с транзакциями на 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 ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 22:45:16 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Поправка : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. И вообще непонятно - зачем так сделано, ведь OLEDB устанавливает при подключении режим OFF ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 22:48:17 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
сам по себе conn.BeginTransaction не вызывает на сервере никаких действий, только флажки на клиентской стороне OLEDB Посмотри внимательно в профайлере и особенно на эффект adXactAbortRetaining+adXactCommitRetaining А задача то какая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2005, 22:54:56 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Задача-то провести серию транзакций, но я расчитывал, что они пойдут при 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 00:15:50 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Уточнение - как определось @@TRANCOUNT Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 00:26:32 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Ну поехали, попытаюсь ещё раз. Логика растёт из совместимости с 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. Если нужно более тонкое управление транзакциями - скажи, помогу сочинить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 02:13:55 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Да, спасибо, в общем режимы явная/автокоммит я понимаю, но вот малость запутался , в BOL глядя - там строит , что транзакция начинаяется с SELECT , ну я чей-то и поставил тот, что меня наиболее интересовал в текущий момент Ну вот выясняется, что операторы д.б. DDL/DML. В общем-то логично, правда BOL опять же могла яснее изъясняться. Если нужно более тонкое управление транзакциями - скажи, помогу сочинить. Ну смотри, припомню. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 15:35:02 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Хорошо. Я вчера BOL глянул и выматерился, по поводу того что SELECT как там написано начинает неявную транзакцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 15:41:49 |
|
||
|
ADP & MsSQL : Первая команда ADODB.Command искажает set implicit_transactions
|
|||
|---|---|---|---|
|
#18+
Alexey Sh > Вот плиз посоветуй : как не запутаться с cnn.Begintrans : Точнее как узнать , что она уже выдавалась, чтобы не было ошибки при такой последовательности команд : cnn.Begintrans cnn.Begintrans желательно обойтись без on error resume next ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2005, 17:54:48 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32888243&tid=1668965]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
79ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 443ms |

| 0 / 0 |
