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

Клиент: 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
29.03.2011, 17:52
    #37188514
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 оставляет shared table lock после cursor_close
rollback пошли.
...
Рейтинг: 0 / 0
29.03.2011, 19:50
    #37188829
danilabagroff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 оставляет shared table lock после cursor_close
White Owl,

Спасибо за внимание. Попробовал, но эффект тот же. Shared lock остается.
...
Рейтинг: 0 / 0
29.03.2011, 20:46
    #37188914
Sergey Orlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 оставляет shared table lock после cursor_close
Мне кажется это не проблема ASA...
...
Рейтинг: 0 / 0
05.04.2011, 23:22
    #37201343
danilabagroff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 оставляет shared table lock после cursor_close
Вернулся к теме, опытным путем(методом инженерного "тыка" :) удалось определить, что 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
06.04.2011, 00:50
    #37201430
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 оставляет shared table lock после cursor_close
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
06.04.2011, 02:59
    #37201468
danilabagroff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 оставляет shared table lock после cursor_close
Победил совершенно неожиданно.
Код: 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
06.04.2011, 18:20
    #37203208
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA9 оставляет shared table lock после cursor_close
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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA9 оставляет shared table lock после cursor_close / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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