powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / SQLEndTran и SQLSetConnectAttr
4 сообщений из 4, страница 1 из 1
SQLEndTran и SQLSetConnectAttr
    #38468584
max950
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,
пытаюсь использовать транзакции:

1. Вызываю SQLSetConnectAttr(hdbc1,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_OFF,SQL_NTS);
2. Вызываю несколько своих запросов....
3. Вызываю SQLEndTran(SQL_HANDLE_DBC, hdbc1, SQL_COMMIT);
4. Вызываю SQLSetConnectAttr(hdbc1,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_ON,SQL_NTS);

Проблема заключается в том, четвертый пункт нормально не отрабатывает.

В профайлере я не вижу "set implicit_transactions off".
Все это производит в пределах одной функции. При вызове другой функции где вначале вызываю SQLSetConnectAttr(hdbc1,SQL_AUTOCOMMIT,SQL_AUTOCOMMIT_ON,SQL_NTS) в профайлере проходит "set implicit_transactions off".

Вызов SQLSetConnectAttr последовательно несколько раз не помогает. при этом если убрать SQLEndTran и оставить только SQLSetConnectAttr, то запросы отрабатывают, т.е. все-таки эта функция что-то делает.

Возможно это проявление того, что в пределах пунктов 1-4 я несколько раз вызываю пары:

SQLAllocHandle(SQL_HANDLE_STMT,hdbc1,&hstmt1);
SQLFreeHandle(SQL_HANDLE_STMT,hstmt1);

В чем может быть причина? Такое ощущение, что то-то висит в памяти, что мешает нормально отработать SQLSetConnectAttr...
...
Рейтинг: 0 / 0
SQLEndTran и SQLSetConnectAttr
    #38468631
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max950В чем может быть причина?
В том, что установка атрибута и не обязана делать что-то видимое снаружи. В твоём случае
транзакция уже закоммичена, а новая ещё не стартовала. Драйверу, который об этом знает,
достаточно установить какой-нибудь внутренний флаг. Попробуй посмотреть что будет при
последующем вызове чего-то, что должно стартовать новую транзакцию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SQLEndTran и SQLSetConnectAttr
    #38468672
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также нужно убедиться, что после
SQLEndTran(SQL_HANDLE_DBC, hdbc1, SQL_COMMIT);

коннекция не содержит активную транзакцию.
Т.е. что по COMMIT транзакция была закоммичена реально.
Как я понял, это у тебя MS SQLServer, так что в этом поможет @@trancount, или как его там сейчас называют.
...
Рейтинг: 0 / 0
SQLEndTran и SQLSetConnectAttr
    #38468683
max950
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--------------------
В том, что установка атрибута и не обязана делать что-то видимое снаружи. В твоём случае
транзакция уже закоммичена, а новая ещё не стартовала. Драйверу, который об этом знает,
достаточно установить какой-нибудь внутренний флаг. Попробуй посмотреть что будет при
последующем вызове чего-то, что должно стартовать новую транзакцию.
--------------------
Да, похоже на то, добавил один "лишний" запрос после SQLSetConnectAttr и увидел "set implicit_transactions off"

--------------------
Также нужно убедиться, что после
SQLEndTran(SQL_HANDLE_DBC, hdbc1, SQL_COMMIT);

коннекция не содержит активную транзакцию.
Т.е. что по COMMIT транзакция была закоммичена реально.
Как я понял, это у тебя MS SQLServer, так что в этом поможет @@trancount, или как его там сейчас называют.
--------------------
В профайлере после вызова SQLEndTran я вижу "IF @@TRANCOUNT > 0 COMMIT TRAN"
кроме того вижу, что прошли изменения в базу.

Больше спасибо за помощь.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / SQLEndTran и SQLSetConnectAttr
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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