powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA9 оставляет shared table lock после cursor_close
8 сообщений из 8, страница 1 из 1
ASA9 оставляет shared table lock после cursor_close
    #37186938
danilabagroff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую,

Клиент: openSUSE с unixODBC, cpp-аппликуха.
Сервер: windows2k3, sybase9.

Открываем кверю:
SELECT * FROM MyTABLE; (Классика...)
Закрываем кверю:
SQLFreeStmt(Stmt, SQL_UNBIND);
SQLFreeStmt(Stmt, SQL_CLOSE);
SQLFreeHandle(SQL_HANDLE_STMT, Stmt);
Stmt = SQL_NULL_HANDLE;

В Sybase central'e видим: "Connected User Properties" > "Last request Type: CURSOR_CLOSE", в тоже время в Table locks MyTABLE = Shared.

Буду благодарен за идеи.
...
Рейтинг: 0 / 0
ASA9 оставляет shared table lock после cursor_close
    #37188514
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rollback пошли.
...
Рейтинг: 0 / 0
ASA9 оставляет shared table lock после cursor_close
    #37188829
danilabagroff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

Спасибо за внимание. Попробовал, но эффект тот же. Shared lock остается.
...
Рейтинг: 0 / 0
ASA9 оставляет shared table lock после cursor_close
    #37188914
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется это не проблема ASA...
...
Рейтинг: 0 / 0
ASA9 оставляет shared table lock после cursor_close
    #37201343
danilabagroff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вернулся к теме, опытным путем(методом инженерного "тыка" :) удалось определить, что shared lock's остаются если
Код: plaintext
1.
ret = SQLSetConnectAttr(dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) SQL_AUTOCOMMIT_OFF,  0 );
Установкой этого аттрибута, я "пообещал", что буду мануального делать роллбеки и коммиты, что собственно и делаю.
Код: plaintext
1.
2.
3.
4.
5.
	SQLEndTran(SQL_HANDLE_DBC, dbc, SQL_COMMIT);
	SQLFreeStmt(q1, SQL_UNBIND);
	SQLFreeStmt(q1, SQL_CLOSE);
	SQLFreeHandle(SQL_HANDLE_STMT, q1);
	q1 = SQL_NULL_HANDLE;
Но, не помогает.
...
Рейтинг: 0 / 0
ASA9 оставляет shared table lock после cursor_close
    #37201430
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danilabagroffВернулся к теме, опытным путем(методом инженерного "тыка" :) удалось определить, что shared lock's остаются если
Код: plaintext
1.
ret = SQLSetConnectAttr(dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER) SQL_AUTOCOMMIT_OFF,  0 );
Установкой этого аттрибута, я "пообещал", что буду мануального делать роллбеки и коммиты, что собственно и делаю.Это все правильно.

danilabagroff
Код: plaintext
1.
2.
3.
4.
5.
	SQLEndTran(SQL_HANDLE_DBC, dbc, SQL_COMMIT);
	SQLFreeStmt(q1, SQL_UNBIND);
	SQLFreeStmt(q1, SQL_CLOSE);
	SQLFreeHandle(SQL_HANDLE_STMT, q1);
	q1 = SQL_NULL_HANDLE;
В принципе это тоже правильно, но...
Сделай лучше:
Код: plaintext
1.
2.
3.
SQLExecDirect(q1, "select ... ");
// полностью вытягиваешь весь рекордсет или SQLCancel(q1)
// а потом не закрывая q1
SQLExecDirect(q1, "COMMIT");
И я надеюсь ты не открывал транзакцию принудительно?
...
Рейтинг: 0 / 0
ASA9 оставляет shared table lock после cursor_close
    #37201468
danilabagroff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Победил совершенно неожиданно.
Код: plaintext
1.
2.
3.
4.
5.
		SQLFreeStmt(Stmt, SQL_UNBIND);
		SQLFreeStmt(Stmt, SQL_CLOSE);
		SQLFreeHandle(SQL_HANDLE_STMT, Stmt);
		Stmt = SQL_NULL_HANDLE;
		SQLEndTran(SQL_HANDLE_DBC, Сonnection->DbcHandle, SQL_COMMIT);

SQLEndTran должен быть последним. Такие дела...
...
Рейтинг: 0 / 0
ASA9 оставляет shared table lock после cursor_close
    #37203208
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
danilabagroffПобедил совершенно неожиданно.
Код: plaintext
1.
2.
3.
4.
5.
		SQLFreeStmt(Stmt, SQL_UNBIND);
		SQLFreeStmt(Stmt, SQL_CLOSE);
		SQLFreeHandle(SQL_HANDLE_STMT, Stmt);
		Stmt = SQL_NULL_HANDLE;
		SQLEndTran(SQL_HANDLE_DBC, Сonnection->DbcHandle, SQL_COMMIT);

SQLEndTran должен быть последним. Такие дела...ээээ.... Чушь.
Ты просто транзакцию закрываешь неправильно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
		SQLFreeStmt(Stmt, SQL_UNBIND);
Означает что ты отвязываешь от стейтмента привязанные буфера для рекордсета.
		SQLFreeStmt(Stmt, SQL_CLOSE);
Запрашиваешь у сервера закрыть курсор для которого был открыт этот стейтмент.
Курсор не обязательно будет закрыт немедленно. Если хочешь точно закрыть курсор,то ви вызывать надо SQLCloseCursor()
		SQLFreeHandle(SQL_HANDLE_STMT, Stmt);
Убивает стейтмент и отдает захваченную им память обратно ОС.
		Stmt = SQL_NULL_HANDLE;
Абсолютно бессмысленная команда. Ты на C пишешь а не на VB.
		SQLEndTran(SQL_HANDLE_DBC, Сonnection->DbcHandle, SQL_COMMIT);
Посылает во все открытые стейтменты построенные на этом DBC команду SQL_COMMIT.
То есть делать ее после SQLFreeHandle бессмысленно.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA9 оставляет shared table lock после cursor_close
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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