Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
09.11.2010, 17:58
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Доброе время суток! Возникла проблема, вообще не могу найти причину. ОС: Windows XP SP3 База: SQL Server 2008 R2 Developer Edition Есть клиентская прога написанная на VB6, которая подключается к SQL Server, строка подключения Provider=SQLOLEDB;Data Source=SERVER;User ID=uid;Password=pwd;Initial Catalog=DB При Код: plaintext сразу вылетает ошибка Cannot create new transaction because capacity was exceeded не могу найти причину, облазил инет, подходящее ничего не вижу Кстати, заметил одну странность, в SQL Server, смотрю через Activity Monitor количество подключений к рабочей базе, при выполнении определенных SQL-инструкций через один и тот же ADO Connection появляется дополнительные соединения, отдельные от основного может быть из-за них? Подсобите камрады Заранее благодарю за помощь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 17:59
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Забыл добавить, код ошибки -2147168227 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 18:03
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Походу другие SQL-инструкции неявно открывают отдельные подключения и отдельные транзакции Хотя там используется ForwardOnly и ReadOnly recordset'ы мм.... как запретить неявные транзакции? или в ADO это невозможно? страно очень, у меня как бы одна платформа, на этой платформе написано очень много приложений, подобных проблем не возникало очень странно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 18:08
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Попробовал в этих recordset'ах указать CursorLocation = adUseClient неявные подключения пропали, т.е. при открытии этих recordset'ов с параметров CursorLocation = UseClient пропали, но ошибка не пропала ;(((((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 18:18
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Также попробовал на каждом шагу до этой ошибки выполнить Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 18:29
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Во первых, количество транзакций надо проверять через select @@trancount Во вторых, ручное управление транзакциями может быть полезно ЧРЕЗВЫЧАЙНО редко. В 99.(9)% ручной вызов begin tran абсолютно не нужен и более того - вреден. И это ВСЕГДА является признаком кривого проектирования приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 18:44
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
хмм... попробовал и через @@TRANCOUNT тот же результат по поводу ручного вызова ADOConnection.BeginTrans мне оно нужно для того чтобы обновление нескольких таблиц выполнилось или не выполнилось грубо говоря, т.е. выполняются несколько SQL-инструкций на обновление и на получение определенных значений, если одна из них не выполняется, откатываются все, т.е. в первую очередь транзакции для чего нужны, чтобы блок операций выполнились целиком как еще по другому сделать? SQL-инструкции должны выполниться на стороне клиента, метод хранимых процедур из-за некоторых специфичных проблем не подойдет такой же метод работает и в других подобных приложениях для интереса я попробовал создать пустой проект, где выполняется такое же подключение к SQL-серверу, к той же базе, и попробовал BeginTrans сделать - работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 18:51
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
т.е. (просто пример, для разъяснения ситуации), грубо, порядок работы проблемного участка такой: cnnMain - ADO Connection к базе Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Т.е. открывается транзакция, получаются определенные значения, их несколько, затем производится калькуляция и обновление нескольких таблиц и затем подтверждение всей операции через CommitTrans При этом в строке BeginTrans выходит та самая ошибка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 18:56
|
|||
|---|---|---|---|
|
|||
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
orunbek, выполни пакет в один прием: Код: plaintext 1. 2. 3. то бишь засунь все это в одну строковую переменную и выполни разом а по хорошему сделай процедуру на сервере ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 19:18
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
orunbekпо поводу ручного вызова ADOConnection.BeginTrans мне оно нужно для того чтобы обновление нескольких таблиц выполнилось или не выполнилось грубо говоря, т.е. выполняются несколько SQL-инструкций на обновление и на получение определенных значений, если одна из них не выполняется, откатываются все, т.е. в первую очередь транзакции для чего нужны, чтобы блок операций выполнились целиком как еще по другому сделать?Ну в принципе, можно и по другому - почти всегда можно заранее узнать сработает обновление базы или не сработает. Твое решение (откатить все если упала одна из команд) проще и надежнее, но для этого вручную открывать транзакцию совсем не нужно. Твоя первая команда к базе автоматически открывает транзакцию, которую потом и надо закрывать. Автоматических транзакций за глаза хватает для практически любых задач. orunbekдля интереса я попробовал создать пустой проект, где выполняется такое же подключение к SQL-серверу, к той же базе, и попробовал BeginTrans сделать - работаетВ приведенном примере ничто не мешает убрать cnnMain.BeginTrans совсем. Здесь он точно не нужен. А причина проблемы скорее всего в том, что у тебя в других функциях/окнах/модулях тоже есть cnnMain.BeginTrans , но в каких-то из этих модулей ты забыл сделать cnnMain.CommitTrans ... Читай в букварях главы про автоматические и вложеные транзакции. И никогда не делай BeginTrans . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 19:22
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
White Owl ... А причина проблемы скорее всего в том, что у тебя в других функциях/окнах/модулях тоже есть cnnMain.BeginTrans , но в каких-то из этих модулей ты забыл сделать cnnMain.CommitTrans ... Читай в букварях главы про автоматические и вложеные транзакции. И никогда не делай BeginTrans . спасибо за советы, но про это я то в первую очередь посмотрел, в других местах нету, поэтому я и удивляюсь как оно может превысить лимит транзакций, если до BeginTrans вообще не открывались транзакции :-) походу буду с админом базы "драться" чтобы на хранимки перевести :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 19:22
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Shocker.Proorunbek, выполни пакет в один прием: Код: plaintext 1. 2. 3. то бишь засунь все это в одну строковую переменную и выполни разом а по хорошему сделай процедуру на сервереЭто неверный совет. Во первых, begin tran внутри пакета ничем не отличается от ADODB.Connection.BeginTran. Во вторых, сервеные процедуры это всего-лишь группирование команд и запуск их в отдельной сессии... а это значит что проблема будет замаскирована областью видимости, но не решена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 19:31
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
orunbekно про это я то в первую очередь посмотрел, в других местах нету, поэтому я и удивляюсь как оно может превысить лимит транзакций, если до BeginTrans вообще не открывались транзакции :-)Кроме BeginTrans есть много других способов открыть транзакцию. Начиная от простых insert/update/delete и до рекурсивных триггеров. Баг может быть где угодно и это еще одна из причин почему я сам никогда не использую begin tran и другим запрещаю. orunbekпоходу буду с админом базы "драться" чтобы на хранимки перевести :-)Как я уже сказал Shocker.Pro, это только спрячет проблему, но не решит ее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 20:03
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
команд обновления или вставки или же удаления до BeginTrans нету, в том числе триггеров ладно попробую еще покопать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 20:37
|
|||
|---|---|---|---|
|
|||
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
White Owl, это упростит прежде всего отладку пакет либо начнет выполняться, либо повиснет в ожидании снятия блокировок, а не будет выдавать невменяемых сообщений и блокировки можно спокойно разглядывать и искать причину а если весь не будет содержать этих адошных стартов транзакций то и такие проблемы перестанут возникать при таких простых операциях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 20:57
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
orunbekкоманд обновления или вставки или же удаления до BeginTrans нету, в том числе триггеров ладно попробую еще покопатьЧто, совсем-совсем нету? :) Ты же пробовал уже свой набор команд на микро-проекте. И он работал, верно? Значит в основном проекте где-то при старте есть открытие паразитных транзакций. Когда ты запускаешь программу и открываешь коннект к базе - транзакций нету. Любая команда после открытия коннекта начинает неявную транзакцию. Любая, в любом окне или даже вообще без окна. Как только ты чихнул в сторону открытого коннекта - в нем завелась неявная автоматическая транзакция. А еще есть такая вещь как DDL и смена сессионых настроек которые могут играться с транзакциями совершенно самостоятельно без твоего явного участия. Это обязательно будет указано в документации, но кто-ж ее читает?... Запускаешь на неявную транзакцию BeginTran один раз - неявная превращается в явную, запускаешь второй раз - получаешь вложеные транзакции со всеми их плюшками и подводными камнями. Откроешь два окна в каждом из которых есть BeginTran получишь двойную вложенность. Закроешь одно окно с commit, а второе с rollback - откатишь изменения сделаные в первом окне. Причем порядок закрытия не важен - что первым закрыл, то и потерял. В идеале, ты с клиента должен посылать атомарные пакеты запросов всегда заканчивающиеся commit или rollback. Чем ближе к атомарности ты подберешься тем лучше. Из окон вообще старайся работать с базой только два раза - при открытии окна прочитать данные и при закрытии записать изменения. различные *Grid работающие с долгоиграющими курсорами должны быть под абсолютным запретом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.11.2010, 21:13
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Shocker.Proпакет либо начнет выполняться, либо повиснет в ожидании снятия блокировок,Эээээ.... нет. К сожалению, это не верно. Блокировка работает на уровне отдельных команд а не целого пакета. До реальной атомарности пакетов MS SQL еще расти и расти. Shocker.Proи блокировки можно спокойно разглядывать и искать причинуУ orunbek к тому же проблема не в блокировках, а в "множественных транзакциях" которые на самом деле скорее всего множественные курсоры. Скорее всего DBGrid какой-нибудь или запросы с перемежающимся указанием adUseClient и adUseServer, которые способны сожрать все ресурсы. Shocker.Proа если весь не будет содержать этих адошных стартов транзакций то и такие проблемы перестанут возникать при таких простых операцияхADODB.Connection.BeginTrans делает всего одну вещь - посылает в открытый коннект команду " begin tran ". А посылка нескольких команд по отдельности почти ничем не отличается от посылки пакета (только множественными резалтсетами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 05:35
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Запросов с adUseClient и adUseServer нет Правда есть Grid'ы, но источник-recordset для них adOpenKeyset, adLockReadOnly попробую поймать момент когда вложенность появляется, у меня есть абсолютно идентичный проект, но с другой базой, и функционал немного отличается, но в плане работы с базой, recordset'ы, begintrans'ы схожие, странно что там вообще подобных проблем не было даже эту ошибку я первый раз вижу, проект был написан под Microsoft Access базу со строкой Microsoft.Jet.OLEDB.4.0, перекинул его на MS SQL и изменил на SQLOLEDB и сразу эта ошибка хмм... попробую пошагово "покопать" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 07:32
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Похоже нашел проблему Были recordset'ы, которые получали определенные значения, cursortype для них был adOpenForwardOnly, вот из-за них и эти проблемы, т.е.: "Having spent a bunch of time researching terms like ADO andtransactions, I have discovered some clues: Sqlserver can only support one forward only cursor on a connection. Sqlserver will silently open another connection if the current connection is busy with a forward only cursur. Forward only cursors are opened whenever you use command.exec and connection.exec syntax. The only way to get a different cursor type is to use recordset.open. A transaction can only exist on a single connection. Nowhere have I found a cogent discussion of these points, just hints scattered here and there." источник: http://www.codeguru.com/forum/showpost.php?s=75eac1e4f34b5a18cec065add1ee07b3&p=800022&postcount=5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 09:28
|
|||
|---|---|---|---|
|
|||
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
White OwlShocker.Proorunbek, выполни пакет в один прием: Код: plaintext 1. 2. 3. то бишь засунь все это в одну строковую переменную и выполни разом а по хорошему сделай процедуру на сервереЭто неверный совет. Во первых, begin tran внутри пакета ничем не отличается от ADODB.Connection.BeginTran. Во вторых, сервеные процедуры это всего-лишь группирование команд и запуск их в отдельной сессии... а это значит что проблема будет замаскирована областью видимости, но не решена. Вот от таких однобоких понятий и появляются проблемы. Хранимки - это не только группировка команд. Вы что-либо слышали об оптимизации, планах выполнения запросов? Клиентский код не следует замешивать с серверным. А тем более управлять транзакциями с клиента. Такие приложения - головная боль админа БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 11:11
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
White OwlВо первых, количество транзакций надо проверять через select @@trancount Во вторых, ручное управление транзакциями может быть полезно ЧРЕЗВЫЧАЙНО редко. В 99.(9)% ручной вызов begin tran абсолютно не нужен и более того - вреден. И это ВСЕГДА является признаком кривого проектирования приложения. Уважаемый, White Owl позвольте с Вами не согласиться. Ручное управление транзакциями это не зло и не является признаком "кривого программирования" Скорее наоборот. Вредно может быть ТОЛЬКО "кривое" (и к месту и не к месту) использование ручного вызова транзакций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 12:03
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
HandKot +1 Пример: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 16:00
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Это только в ADO скрытно создаются дополнительные подключения к серверу? В ADO.NET исправили это? или так же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 16:11
|
|||
|---|---|---|---|
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
orunbekЭто только в ADO скрытно создаются дополнительные подключения к серверу? В ADO.NET исправили это? или так же? вы о каких срытных подключениях спрашиваете? надеюсь, что у вас всегда так используется подключение: Код: plaintext 1. 2. 3. 4. 5. в таком случае всегда используется одно соединение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.11.2010, 16:18
|
|||
|---|---|---|---|
|
|||
Cannot create new transaction because capacity was exceeded |
|||
|
#18+
Konst_Oneвы о каких срытных подключениях спрашиваете? про скрытные подключения читать отсюда: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=758106&msg=8764262 начиная с "Не надо говорить глупости." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=60&tablet=1&tid=2159265]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 169ms |

| 0 / 0 |
