powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
28 сообщений из 28, показаны все 2 страниц
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723337
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую вложенные транзакции при работе через ADO следующим образом:
- открываю соединение
- посылаю BEGIN TRANSACTION (пробовал и через begintrans/committrans - тот же эффект)
- выполняются всякие разные изменения связанных данных в базе (в т.ч. через сложные хранимки, где могут быть свои транзакции)
- посылаю COMMIT TRANSACTION
Соединение явно не закрываю и в ряде случаев при отмене транзакции не посылаю ROLLBACK, предполагая что он сделается неявно (как и закрытие соединения) при выходе из контекста создавшего соединение (который происходит тут же) - т.е. при уничтожении переменной соединения

Но, как оказалось, не тут-то было. Выяснилось, что по дефолту ADO не уничтожает такие соединения а помещает в пул и переиспользует. В результате на практике наблюдается интересная картина - если транзакция осталась незавершенной, то дальше в этом соединении могут происходить чудеса, механику которых я затрудняюсь объяснить. Когда в новой транзакции (с точки зрения посылающей стороны) происходит фиксация предыдущей незавершенной транзакция и часть новой. И так далее. Сайд-эффекты зависят от поведения пула.
Теоретически я конечно могу пытаться всегда когда надо откатывать транзакции и закрывать соединение явно, но на практике я все равно не могу этого гарантировать, поэтому хотелось бы чтобы неявное закрытие соединения приводило к его уничтожению с откатом незавершенных транзакций (фиг с ним, с затратами на создание соединений, не смертельно).

Нашел, что отключить сервис пула ADO можно через реестр и в строке соединения, установив опцию OLE DB Services=-2
Пока прописал в строке соединения, сижу наблюдаю... В реестре боюсь установить не там где надо, так как не до конца понимаю для какого провайдера прописать (в строке соединения у меня просто driver={SQL Server} прописано).
В чем вопрос, собственно. Встречал еще рекомендации установить OLE DB Services=-4. Это типа кроме пула соединений ADO отключает еще и некий "Automatic Transaction Enlistment", по которому что-то не шибко гуглится.
Скажите пожалуйста, кто в курсе, как именно изменится поведение при его отключении.
Ну и буду рад любым комментариям, способным помочь разобраться с ситуацией.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723347
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нужно лениться писать ROLLBACK везде, где он нужен. И тогда описанных проблем не будет.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723357
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmНе нужно лениться писать ROLLBACK везде, где он нужен. И тогда описанных проблем не будет.
Просто будет минимизирована вероятность появления описанных проблем.
Даже если роллбэк будет прописан абсолютно везде и будут корректно перехватываться все эксепшены приложения-инициатора, то все равно единственный краш приложения произошедший "не вовремя" приведет к зависанию и последующему переиспользованию соединения с незавершенной транзакцией и последующим недопустимым сайд-эффектам.
Пока что было бы интересно обсудить возможность своевременного и гарантированного закрытия соединений.
Насколько я понял, это не такая уж экзотика и "живые" люди используют отключение пула.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723360
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisher,

Вы выполняете сценарий "солнечного дня" и полагаетесь на неявное поведение функций. Во избежание проблем необходимо применять полный контроль над транзакциями и ошибками, в частности, в обработчике ошибок кода выполняться проверку счетчика транзакций открытого соединения и, если оно > 0, выполнять ROLLBACK.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723363
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisher,

Вы должны явно закрывать соединение при использовании пула.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723364
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовfisher,
Вы выполняете сценарий "солнечного дня" и полагаетесь на неявное поведение функций. Во избежание проблем необходимо применять полный контроль над транзакциями и ошибками, в частности, в обработчике ошибок кода выполняться проверку счетчика транзакций открытого соединения и, если оно > 0, выполнять ROLLBACK.
Наборот. Я хочу чтобы при любом сценарии когда "что-то пошло не так", вплоть до краша приложения, незавершенная транзакция была гарантированно отменена.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723365
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisher,

при счетчике 0 открытых транзакций нет. При краше приложения пул будет уничтожен и транзакции откатит сервер.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723368
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовfisher,
При краше приложения пул будет уничтожен и транзакции откатит сервер.
Этого не происходит. Пул держит не приложение. Это подсистема OLEDB.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723370
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisher,

чудеса пишете. У Вас отдельное приложение для связи с сервером? Как у Вас живет класс вне приложения?
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723376
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisherДаже если роллбэк будет прописан абсолютно везде и будут корректно перехватываться все эксепшены приложения-инициатора, то все равно единственный краш приложения произошедший "не вовремя" приведет к зависанию и последующему переиспользованию соединения с незавершенной транзакциейВы фантазируете. Пул подключений работает на уровне приложения, а не системы.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723378
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовfisher,
чудеса пишете. У Вас отдельное приложение для связи с сервером? Как у Вас живет класс вне приложения?
Эти чудеса, к сожалению, приходится наблюдать :)
COM-компоненты - это не совсем классы. Это довольно хитрые приложения, с которыми можно работать подобно классам.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723396
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisher,

почитайте, что такое COM объекты.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723411
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формулировки открытым текстом, что пул ADO не является частью приложения я не нашел, но здесь есть интересная формулировка:
авторConnections are pooled per process, per application domain , per connection string and when integrated security is used, per Windows identity.
Если бы пул существовал только в рамках приложения, то к чему бы было это упоминать? Кстати, там же упоминается, что явное закрытие соединения (close) не уничтожает соединение, а гарантированно возвращает его в пул.
Аналогичное упоминание (про сепарацию соединений в пуле "per application") нахожу и в других источниках.
Нашел, кстати, старую ветку где чел безответно задавал похожие вопросы.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723420
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisher,

Почитайте, что такое домен приложения.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723430
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmfisher,
Почитайте, что такое домен приложения.
Почитал. И как это работает против моего предположения?
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723436
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisherПочитал.И вычитали, что домен приложения глобальная структура?
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723452
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю пока прервать обсуждение. Обсуждаемый вопрос для меня важен, потому как я наблюдал поведение которое не могу объяснить иначе и хочу найти объяснение, так как чудес не бывает. Но этот вопрос подождет.
Гораздо важнее для меня прямо сейчас ответ на заданный ранее вопрос:
Что произойдет при указании OLE DB Services=-4? Как изменится поведение соединений? Что такое "Automatic Transaction Enlistment" в данном контексте?
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723453
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisherКстати, там же упоминается, что явное закрытие соединения (close) не уничтожает соединение, а гарантированно возвращает его в пул.При закрытии соединения, и возврате его в пул, транзакция гарантированно откатывается.

У вас, очевидно, проблема в том, что при крахе вашего приложения то, другое приложение, не выполняет Close.

fisherВыяснилось, что по дефолту ADO не уничтожает такие соединения а помещает в пул и переиспользует. В результате на практике наблюдается интересная картина - если транзакция осталась незавершенной, то дальше в этом соединении могут происходить чудеса, механику которых я затрудняюсь объяснить. Когда в новой транзакции (с точки зрения посылающей стороны) происходит фиксация предыдущей незавершенной транзакция и часть новой. И так далее. Сайд-эффекты зависят от поведения пула.Или вы путаете (используете неподходящщую терминологию), называя "пулом коннектов" такие ситуации, когда ADO оставляет открытые коннекты (т.е. не возвращает их в пул).

Но это, вообще говоря, проблема криворуких программистов, а не какого то неожидаемого поведения сиквела или компонентов доступа.

Либо вы никогда не допускаете ситуацию, когда ADO не возвращает коннекты в пул, либо вы контролируете состояние всех ваших открытых (взятых из пула, и не возвращённых в пул) коннектов, закрывая открытые транзакции
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723466
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmНе нужно лениться писать ROLLBACK везде, где он нужен. И тогда описанных проблем не будет.
Не нужно лениться закрывать соединения.
Приложение ваще не должно пользоваться begin transaction.

fisherединственный краш приложения произошедший "не вовремя" приведет к зависанию и последующему переиспользованию соединения с незавершенной транзакцией и последующим недопустимым сайд-эффектам.

Не надо фантазировать.

Но если фантазия неудержима - при открытии соединения проверяйте

Код: sql
1.
if @@trancount > 0 rollback transaction;
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723506
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisherЧто произойдет при указании OLE DB Services=-4? Как изменится поведение соединений? Что такое "Automatic Transaction Enlistment" в данном контексте? https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ole-db-odbc-and-oracle-connection-pooling
Для вас никак не изменится - вы управляете транзакциями явно, а не средствами ADO.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723574
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgfisherКстати, там же упоминается, что явное закрытие соединения (close) не уничтожает соединение, а гарантированно возвращает его в пул.При закрытии соединения, и возврате его в пул, транзакция гарантированно откатывается.

У вас, очевидно, проблема в том, что при крахе вашего приложения то, другое приложение, не выполняет Close.

Возможно. Это было просто к слову, что даже при явном "закрытии" соединения оно на самом деле не закрывается при наличии пулинга.

alexeyvgfisherВыяснилось, что по дефолту ADO не уничтожает такие соединения а помещает в пул и переиспользует. В результате на практике наблюдается интересная картина - если транзакция осталась незавершенной, то дальше в этом соединении могут происходить чудеса, механику которых я затрудняюсь объяснить. Когда в новой транзакции (с точки зрения посылающей стороны) происходит фиксация предыдущей незавершенной транзакция и часть новой. И так далее. Сайд-эффекты зависят от поведения пула.Или вы путаете (используете неподходящщую терминологию), называя "пулом коннектов" такие ситуации, когда ADO оставляет открытые коннекты (т.е. не возвращает их в пул).

Все возможно. Я уже мало что понимаю. Мой мозг взрывает не наличие соединений с незавершенными транзакциями, а возможность продолжения этих транзакций после повторного соединения, которое логика программы совершенно логично ожидает как "девственное" с точки зрения возможных сайд-эффектов. То есть их быть не должно. А они есть. Я своими глазами наблюдал при переподключении и отработке новых транзакций фиксацию транзакции, начатую полчаса назад. Полчаса, Карл!
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723580
fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm, Я застрял на попытке перевода и осознания фразы
Enlist - 'true'. When true, the pooler automatically enlists the connection in the current transaction context of the creation thread if a transaction context exists.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723715
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fisherМой мозг взрывает не наличие соединений с незавершенными транзакциями, а возможность продолжения этих транзакций после повторного соединения, которое логика программы совершенно логично ожидает как "девственное" с точки зрения возможных сайд-эффектов. То есть их быть не должно. А они есть. Я своими глазами наблюдал при переподключении и отработке новых транзакций фиксацию транзакции, начатую полчаса назад. Полчаса, Карл!Да не может такого быть, не может из пула взяться соединение с незакрытой транзакцией.

Это всё легко проверить, зачем чего то ловить, достаточно набросать тест.

Просто где то не делается Close
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723789
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgfisherМой мозг взрывает не наличие соединений с незавершенными транзакциями, а возможность продолжения этих транзакций после повторного соединения, которое логика программы совершенно логично ожидает как "девственное" с точки зрения возможных сайд-эффектов. То есть их быть не должно. А они есть. Я своими глазами наблюдал при переподключении и отработке новых транзакций фиксацию транзакции, начатую полчаса назад. Полчаса, Карл!Да не может такого быть, не может из пула взяться соединение с незакрытой транзакцией.Конечно не может. ТС написал кривой код и теперь грешит на пул.
авторSQL Server provides a procedure sp_reset_connection that is designed to reset the settings and the state. So when you use connection pooling (the default), every time you open a connection, ADO.NET executes sp_reset_connection to make sure you get a "clean" connection before it hands it over to you.
Вы явно оставляете где-то открытые транзакции, которые висят по пол часа, а потом начинаете в них выполнять какие то команды.
А теперь еще объясните, если у вас каждый процесс открывает и закрывает транзакцию (ну или даже с учетом вложенных транзакций), то счетчик транзакций должен быть:
Код: plaintext
1.
2.
3.
4.
0
+1=1 -- BEGIN
+1=2 -- BEGIN
-1=1  -- COMMIT
-1=0  -- COMMIT
так?
Ну а если как вы утверждаете ваш процесс получает сессию с открытой транзакцией:
Код: plaintext
1.
2.
3.
4.
1
+1=2 -- BEGIN
+1=3 -- BEGIN
-1=2  -- COMMIT
-1=1  -- COMMIT
то кто простите делает "фиксацию транзакции, начатую полчаса назад"? Если у вас там идеальный код, то кто выполняет лишний COMMIT?

fisherпри отмене транзакции не посылаю ROLLBACKА вот это конечно форменная глупость.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723806
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mindfisherпри отмене транзакции не посылаю ROLLBACKА вот это конечно форменная глупость.Да в принципе можно и не посылать. Но тогда нужно быть уверенным, что выполняешь Close (возвращая коннект в пул, или реально его закрывая, это уже неважно, результат будет одинаковый).
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723812
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgMindпропущено...
А вот это конечно форменная глупость.Да в принципе можно и не посылать. Но тогда нужно быть уверенным, что выполняешь Close (возвращая коннект в пул, или реально его закрывая, это уже неважно, результат будет одинаковый).Тому кто в этом коде потом будет пытаться разобраться тоже нужно будет всегда помнить о том что где-то там была открыта транзакция, а вот тут логически она должна бы откатываться, но это необязательно, потому что где-то там в другом месте наверняка есть Close.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723826
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mindalexeyvgпропущено...
Да в принципе можно и не посылать. Но тогда нужно быть уверенным, что выполняешь Close (возвращая коннект в пул, или реально его закрывая, это уже неважно, результат будет одинаковый).Тому кто в этом коде потом будет пытаться разобраться тоже нужно будет всегда помнить о том что где-то там была открыта транзакция, а вот тут логически она должна бы откатываться, но это необязательно, потому что где-то там в другом месте наверняка есть Close.А это уже вопрос организации кода, внутренней архитектуры.

Конечно, если код - это миллион строк с равномерным вкраплением работы с ADO, то да, надёжнее делать rollback.
Но, вообще говоря, в таком коде будут ошибки, ставь rollback или не ставь - ведь ветка могла пойти и по другому, правильно?

Более безопасно - обрамлять объект ADOConnection в using, и не делать циклов внутри, тогда трудно ошибиться, и "не закрыть". Но в этом случае какой нибудь ушлый кодер может обойти правила, потому что "очень надо, а мне манеджер сказал, что...", и вот там уже наделать косяков.

А самое надёжное - делать свою обёртку, в которой будет один вызов - одно обращение к сиквелу, с одним открытием/закрытием коннекта. Вот это гарантирукет, потому что "оно само", плюс можно вылизать работу с ADO до совершенства.

Мы, например, делали такую обёртку на основе Microsoft Enterprise Library, и получили не только гарантию от этих ошибок, но и от многих других, да ещё и, например, высокую скорость, потому что в тыщах мест кода никто не будет заморачиваться перформансом, а один раз можно.
...
Рейтинг: 0 / 0
MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
    #39723847
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgДа в принципе можно и не посылать. Но тогда нужно быть уверенным, что выполняешь CloseНе поможет.
У ТС управлегние транзакциями не методами OLE DB и sp_reset_connection вызывается в момент повторного использования, а не по Close. Так что транзакция останется открытой.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL через ADO - пул соединений и чудеса с незавершенными транзакциями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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