LOCK TABLE можно использовать только в блоках транзакций
Я обновляю PostgreSQL с 8.1.3 до 9.2.9 для нашего продукта. Мы используем unixODBC 2.2.11 для доступа к базе данных, и она написана на языке C++. Я получил следующую ошибку после обновления:
"LOCK TABLE can only be used in transaction blocks".
Я проверил примечание к выпуску PostgreSQL и обнаружил, что он запрещает LOCK TABLE вне блока транзакции.
Я проверил код и обнаружил, что мы заблокировали некоторые таблицы в переходе, пример кода:
db_connect.BeginTrans();
rtn_code = LockTable(db_connect, Setting_Filter.m_backup_tables, LOCK_SHARE);
...
db_connect.Commit();
Мы используем следующие API для создания неявной транзакции в BeginTrans():
int BeginTrans()
{
return SQLSetConnectAttr( m_ConHandle,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0 );
}
Мы выполняем следующую таблицу блокировки sql в функции LockTable():
lock table %s in share mode
Мой вопрос:
Означает ли это, что BeginTrans () не создает транзакцию успешно в Postgres 9.2?
Я заметил, что мы часто используем "НАЧАЛО ПЕРЕВОДА"; в PL/SQL есть ли соответствующий API в unixODBC для явного запуска транзакции?
1 ответ
Эта проблема была исправлена явным вызовом для транзакции, например:
int Commit()
{
Execute("commit");
int rt=SQLEndTran( SQL_HANDLE_DBC, m_ConHandle, SQL_COMMIT );
SQLSetConnectAttr( m_ConHandle,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_ON, 0 );
return rt;
}
int Rollback()
{
Execute("rollback");
int rt=SQLEndTran( SQL_HANDLE_DBC, m_ConHandle, SQL_ROLLBACK );
SQLSetConnectAttr( m_ConHandle,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_ON, 0 );
return rt;
}
int BeginTrans()
{
SQLSetConnectAttr( m_ConHandle,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0 );
return Execute("begin transaction");
}