powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Cannot create new transaction because capacity was exceeded
29 сообщений из 29, показаны все 2 страниц
Cannot create new transaction because capacity was exceeded
    #36945601
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе время суток!
Возникла проблема, вообще не могу найти причину.
ОС: 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
ADOConnection.BeginTrans

сразу вылетает ошибка
Cannot create new transaction because capacity was exceeded

не могу найти причину, облазил инет, подходящее ничего не вижу

Кстати, заметил одну странность, в SQL Server, смотрю через Activity Monitor количество подключений к рабочей базе, при выполнении определенных SQL-инструкций через один и тот же ADO Connection появляется дополнительные соединения, отдельные от основного
может быть из-за них?

Подсобите камрады

Заранее благодарю за помощь
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945602
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл добавить, код ошибки -2147168227
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945610
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Походу другие SQL-инструкции неявно открывают отдельные подключения и отдельные транзакции
Хотя там используется ForwardOnly и ReadOnly recordset'ы
мм.... как запретить неявные транзакции? или в ADO это невозможно?
страно очень, у меня как бы одна платформа, на этой платформе написано очень много приложений, подобных проблем не возникало
очень странно
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945624
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал в этих recordset'ах указать CursorLocation = adUseClient
неявные подключения пропали, т.е. при открытии этих recordset'ов с параметров CursorLocation = UseClient пропали, но ошибка не пропала ;((((((
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945646
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также попробовал на каждом шагу до этой ошибки
выполнить
Код: plaintext
select sum(open_tran) from master..sysprocesses
на стороне SQL-сервера, во всех случаях возвращает 0
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945667
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых, количество транзакций надо проверять через select @@trancount
Во вторых, ручное управление транзакциями может быть полезно ЧРЕЗВЫЧАЙНО редко. В 99.(9)% ручной вызов begin tran абсолютно не нужен и более того - вреден. И это ВСЕГДА является признаком кривого проектирования приложения.
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945703
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмм...
попробовал и через @@TRANCOUNT
тот же результат
по поводу ручного вызова ADOConnection.BeginTrans
мне оно нужно для того чтобы обновление нескольких таблиц выполнилось или не выполнилось грубо говоря, т.е. выполняются несколько SQL-инструкций на обновление и на получение определенных значений, если одна из них не выполняется, откатываются все,
т.е. в первую очередь транзакции для чего нужны, чтобы блок операций выполнились целиком
как еще по другому сделать?
SQL-инструкции должны выполниться на стороне клиента, метод хранимых процедур из-за некоторых специфичных проблем не подойдет
такой же метод работает и в других подобных приложениях

для интереса я попробовал создать пустой проект, где выполняется такое же подключение к SQL-серверу, к той же базе, и попробовал BeginTrans сделать - работает
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945718
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. (просто пример, для разъяснения ситуации),
грубо, порядок работы проблемного участка такой:

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.
cnnMain.BeginTrans

strsQL = "SELECT ... AS Total ...."
rst.Open strSQL, cnnMain, adForwardOnly, adLockReadOnly
intA = rst.Fields("Total").Value

strsQL = "SELECT ... AS Total ...."
rst.Open strSQL, cnnMain, adForwardOnly, adLockReadOnly
intB = rst.Fields("Total").Value

intC = intA + intB

strSQL = "UPDATE .... SET FieldValue = " & CStr(intC) ...
cnnMain.Execute strSQL

....

strSQL = "UPDATE .... SET FieldValue = " & CStr(intC) ...
cnnMain.Execute strSQL

....

cnnMain.CommitTrans

Т.е. открывается транзакция, получаются определенные значения, их несколько, затем производится калькуляция и обновление нескольких таблиц и затем подтверждение всей операции через CommitTrans
При этом в строке BeginTrans выходит та самая ошибка
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945724
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbek,

выполни пакет в один прием:
Код: plaintext
1.
2.
3.
begin tran
UPDATE .... SET FieldValue =  ...
UPDATE .... SET FieldValue =  ...
commit tran

то бишь засунь все это в одну строковую переменную и выполни разом

а по хорошему сделай процедуру на сервере
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945744
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekпо поводу ручного вызова ADOConnection.BeginTrans
мне оно нужно для того чтобы обновление нескольких таблиц выполнилось или не выполнилось грубо говоря, т.е. выполняются несколько SQL-инструкций на обновление и на получение определенных значений, если одна из них не выполняется, откатываются все,
т.е. в первую очередь транзакции для чего нужны, чтобы блок операций выполнились целиком
как еще по другому сделать?Ну в принципе, можно и по другому - почти всегда можно заранее узнать сработает обновление базы или не сработает.
Твое решение (откатить все если упала одна из команд) проще и надежнее, но для этого вручную открывать транзакцию совсем не нужно. Твоя первая команда к базе автоматически открывает транзакцию, которую потом и надо закрывать. Автоматических транзакций за глаза хватает для практически любых задач.

orunbekдля интереса я попробовал создать пустой проект, где выполняется такое же подключение к SQL-серверу, к той же базе, и попробовал BeginTrans сделать - работаетВ приведенном примере ничто не мешает убрать cnnMain.BeginTrans совсем. Здесь он точно не нужен.
А причина проблемы скорее всего в том, что у тебя в других функциях/окнах/модулях тоже есть cnnMain.BeginTrans , но в каких-то из этих модулей ты забыл сделать cnnMain.CommitTrans ...

Читай в букварях главы про автоматические и вложеные транзакции.
И никогда не делай BeginTrans .
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945752
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
...
А причина проблемы скорее всего в том, что у тебя в других функциях/окнах/модулях тоже есть cnnMain.BeginTrans , но в каких-то из этих модулей ты забыл сделать cnnMain.CommitTrans ...

Читай в букварях главы про автоматические и вложеные транзакции.
И никогда не делай BeginTrans .

спасибо за советы,
но про это я то в первую очередь посмотрел, в других местах нету, поэтому я и удивляюсь как оно может превысить лимит транзакций, если до BeginTrans вообще не открывались транзакции :-)
походу буду с админом базы "драться" чтобы на хранимки перевести :-)
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945753
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proorunbek,

выполни пакет в один прием:
Код: plaintext
1.
2.
3.
begin tran
UPDATE .... SET FieldValue =  ...
UPDATE .... SET FieldValue =  ...
commit tran

то бишь засунь все это в одну строковую переменную и выполни разом

а по хорошему сделай процедуру на сервереЭто неверный совет.
Во первых, begin tran внутри пакета ничем не отличается от ADODB.Connection.BeginTran. Во вторых, сервеные процедуры это всего-лишь группирование команд и запуск их в отдельной сессии... а это значит что проблема будет замаскирована областью видимости, но не решена.
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945762
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekно про это я то в первую очередь посмотрел, в других местах нету, поэтому я и удивляюсь как оно может превысить лимит транзакций, если до BeginTrans вообще не открывались транзакции :-)Кроме BeginTrans есть много других способов открыть транзакцию. Начиная от простых insert/update/delete и до рекурсивных триггеров. Баг может быть где угодно и это еще одна из причин почему я сам никогда не использую begin tran и другим запрещаю.
orunbekпоходу буду с админом базы "драться" чтобы на хранимки перевести :-)Как я уже сказал Shocker.Pro, это только спрячет проблему, но не решит ее.
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945793
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
команд обновления или вставки или же удаления до BeginTrans нету, в том числе триггеров
ладно попробую еще покопать
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945819
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

это упростит прежде всего отладку

пакет либо начнет выполняться, либо повиснет в ожидании снятия блокировок,
а не будет выдавать невменяемых сообщений

и блокировки можно спокойно разглядывать и искать причину

а если весь не будет содержать этих адошных стартов транзакций
то и такие проблемы перестанут возникать при таких простых операциях
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945836
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekкоманд обновления или вставки или же удаления до BeginTrans нету, в том числе триггеров
ладно попробую еще покопатьЧто, совсем-совсем нету? :) Ты же пробовал уже свой набор команд на микро-проекте. И он работал, верно? Значит в основном проекте где-то при старте есть открытие паразитных транзакций.

Когда ты запускаешь программу и открываешь коннект к базе - транзакций нету. Любая команда после открытия коннекта начинает неявную транзакцию. Любая, в любом окне или даже вообще без окна. Как только ты чихнул в сторону открытого коннекта - в нем завелась неявная автоматическая транзакция. А еще есть такая вещь как DDL и смена сессионых настроек которые могут играться с транзакциями совершенно самостоятельно без твоего явного участия. Это обязательно будет указано в документации, но кто-ж ее читает?...
Запускаешь на неявную транзакцию BeginTran один раз - неявная превращается в явную, запускаешь второй раз - получаешь вложеные транзакции со всеми их плюшками и подводными камнями. Откроешь два окна в каждом из которых есть BeginTran получишь двойную вложенность. Закроешь одно окно с commit, а второе с rollback - откатишь изменения сделаные в первом окне. Причем порядок закрытия не важен - что первым закрыл, то и потерял.
В идеале, ты с клиента должен посылать атомарные пакеты запросов всегда заканчивающиеся commit или rollback. Чем ближе к атомарности ты подберешься тем лучше. Из окон вообще старайся работать с базой только два раза - при открытии окна прочитать данные и при закрытии записать изменения. различные *Grid работающие с долгоиграющими курсорами должны быть под абсолютным запретом.
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36945854
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпакет либо начнет выполняться, либо повиснет в ожидании снятия блокировок,Эээээ.... нет.
К сожалению, это не верно. Блокировка работает на уровне отдельных команд а не целого пакета. До реальной атомарности пакетов MS SQL еще расти и расти.

Shocker.Proи блокировки можно спокойно разглядывать и искать причинуУ orunbek к тому же проблема не в блокировках, а в "множественных транзакциях" которые на самом деле скорее всего множественные курсоры. Скорее всего DBGrid какой-нибудь или запросы с перемежающимся указанием adUseClient и adUseServer, которые способны сожрать все ресурсы.

Shocker.Proа если весь не будет содержать этих адошных стартов транзакций
то и такие проблемы перестанут возникать при таких простых операцияхADODB.Connection.BeginTrans делает всего одну вещь - посылает в открытый коннект команду " begin tran ". А посылка нескольких команд по отдельности почти ничем не отличается от посылки пакета (только множественными резалтсетами).
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36946150
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запросов с adUseClient и adUseServer нет
Правда есть Grid'ы, но источник-recordset для них adOpenKeyset, adLockReadOnly
попробую поймать момент когда вложенность появляется, у меня есть абсолютно идентичный проект, но с другой базой, и функционал немного отличается, но в плане работы с базой, recordset'ы, begintrans'ы схожие, странно что там вообще подобных проблем не было
даже эту ошибку я первый раз вижу, проект был написан под Microsoft Access базу со строкой Microsoft.Jet.OLEDB.4.0, перекинул его на MS SQL и изменил на SQLOLEDB и сразу эта ошибка
хмм... попробую пошагово "покопать"
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36946188
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже нашел проблему
Были 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
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36946276
White OwlShocker.Proorunbek,

выполни пакет в один прием:
Код: plaintext
1.
2.
3.
begin tran
UPDATE .... SET FieldValue =  ...
UPDATE .... SET FieldValue =  ...
commit tran

то бишь засунь все это в одну строковую переменную и выполни разом

а по хорошему сделай процедуру на сервереЭто неверный совет.
Во первых, begin tran внутри пакета ничем не отличается от ADODB.Connection.BeginTran. Во вторых, сервеные процедуры это всего-лишь группирование команд и запуск их в отдельной сессии... а это значит что проблема будет замаскирована областью видимости, но не решена.

Вот от таких однобоких понятий и появляются проблемы. Хранимки - это не только группировка команд. Вы что-либо слышали об оптимизации, планах выполнения запросов? Клиентский код не следует замешивать с серверным. А тем более управлять транзакциями с клиента. Такие приложения - головная боль админа БД.
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36946586
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВо первых, количество транзакций надо проверять через select @@trancount
Во вторых, ручное управление транзакциями может быть полезно ЧРЕЗВЫЧАЙНО редко. В 99.(9)% ручной вызов begin tran абсолютно не нужен и более того - вреден. И это ВСЕГДА является признаком кривого проектирования приложения.
Уважаемый, White Owl позвольте с Вами не согласиться.
Ручное управление транзакциями это не зло и не является признаком "кривого программирования"
Скорее наоборот.
Вредно может быть ТОЛЬКО "кривое" (и к месту и не к месту) использование ручного вызова транзакций
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36946826
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
+1

Пример:
Код: plaintext
1.
2.
3.
4.
5.
on error goto errh
rs1.UpdateBatch
rs2.UpdateBatch
rs3.UpdateBatch
exit sub
errh:
В rs3 произошла ошибка, а условия задачи таковы, что данные имеют смысл только целиком. В этом случае в базу попадет как минимум ненужный мусор.
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36947724
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это только в ADO скрытно создаются дополнительные подключения к серверу?
В ADO.NET исправили это? или так же?
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36947751
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekЭто только в ADO скрытно создаются дополнительные подключения к серверу?
В ADO.NET исправили это? или так же?

вы о каких срытных подключениях спрашиваете?
надеюсь, что у вас всегда так используется подключение:


Код: plaintext
1.
2.
3.
4.
5.
Dim cn as ADODB.Connection

...
Set rs.ActiveConnection = cn
rs.Open SQL,,...
...


в таком случае всегда используется одно соединение
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36947771
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneвы о каких срытных подключениях спрашиваете?

про скрытные подключения читать отсюда:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=758106&msg=8764262

начиная с "Не надо говорить глупости."
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36947778
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneвы о каких срытных подключениях спрашиваете?

про скрытные подключения читать отсюда:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=758106&msg=8764262

начиная с "Не надо говорить глупости."


а ты посмотри мой код выше, чтобы таких глупостей больше не делать
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36947794
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа ты посмотри мой код выше, чтобы таких глупостей больше не делать
Кто? Я? Я ща вообще исключительно через Command с хранимками работаю.
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36947816
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneа ты посмотри мой код выше, чтобы таких глупостей больше не делать
Кто? Я? Я ща вообще исключительно через Command с хранимками работаю.

это я ТС, не тебе конечно.
для объекта ADODB.Command распроняется такое же правило о передачи открытого ранее объекта ADODB.Connection через установку:

Код: plaintext
Set cmd.ActiveConnection = cn
...
Рейтинг: 0 / 0
Cannot create new transaction because capacity was exceeded
    #36950277
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneвы о каких срытных подключениях спрашиваете?

про скрытные подключения читать отсюда:
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=758106&msg=8764262

начиная с "Не надо говорить глупости."

как раз таки я еще раз убедился в том, что ADO создает дополнительные подключения,
если интересно, могу даже проекты, демонстрирующие эту возможность показать, на примере VB6 & ADO & MS SQL

или же в этой теме про это тоже прочитайте
Аудит изменений через CONTEXT_INFO
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Cannot create new transaction because capacity was exceeded
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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