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

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

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
09.11.2010, 18:56
    #36945724
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Cannot create new transaction because capacity was exceeded
orunbek,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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


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