我正在为我们的产品将PostgreSQL从8.1.3升级到9.2.9。我们使用unixODBC 2.2.11访问数据库,它是用 C++ 编写的。升级后出现以下错误:
"LOCK TABLE can only be used in transaction blocks".
我检查了PostgreSQL的release note,发现它不允许在事务块之外锁定表。
我检查了代码,发现我们在事务中锁定了一些表,示例代码:
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 );
}
我们在LockTable()函数中执行以下锁表sql:
lock table %s in share mode
我的问题是:
1.这是否意味着BeginTrans()不能在Postgres 9.2中成功创建事务?
1.我注意到我们经常使用"开始过渡"; '在PL/SQL中,unixODBC中是否有相应的API来显式启动事务?
1条答案
按热度按时间a0zr77ik1#
此问题已通过显式调用事务得到修复,例如: