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

Мой вопрос:

  1. Означает ли это, что BeginTrans() не может успешно создать транзакцию в Postgres 9.2?

  2. Я заметил, что мы часто используем «НАЧАТЬ ПЕРЕВОД»; в PL/SQL есть ли соответствующий API в unixODBC для явного запуска транзакции?


person Thomas Zhou    schedule 26.11.2014    source источник
comment
Посмотрите, что возвращает TXID_CURRENT() до и после каждого вызова BeginTrans, LockTable и Commit.   -  person Kouber Saparev    schedule 26.11.2014


Ответы (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");
    }
person Thomas Zhou    schedule 30.11.2014