Я обновляю 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 для явного запуска транзакции?
TXID_CURRENT()
до и после каждого вызоваBeginTrans
,LockTable
иCommit
. - person Kouber Saparev   schedule 26.11.2014