出于某种原因,当我尝试在以下环境中回滚我的事务时,我遇到了“无法回滚”消息的操作错误:
try:
cursors[instance].execute("lock revision, app, timeout IN SHARE MODE")
cursors[instance].execute("insert into app (type, active, active_revision, contents, z) values ('session', true, %s, %s, 0) returning id", (cRevision, sessionId))
sAppId = cursors[instance].fetchone()[0]
cursors[instance].execute("insert into revision (app_id, type) values (%s, 'active')", (sAppId,))
cursors[instance].execute("insert into timeout (app_id, last_seen) values (%s, now())", (sAppId,))
connections[instance].commit()
except pgdb.DatabaseError, e:
connections[instance].rollback()
return "{status: 'error', errno:4, errmsg: \"%s\"}"%(str(e).replace('\"', '\\"').replace('\n', '\\n').replace('\r', '\\r'))
正在使用的驱动程序是PGDB。
这里有什么根本错误?
答案 0 :(得分:1)
你在找错了地方。 PostgreSQL日志对你正在做什么说了什么?
答案 1 :(得分:0)
如果排除锁定声明会怎样?
这是pgdb.py中发生的事情:
def rollback(self):
"""Roll back to the start of any pending transaction."""
if self._cnx:
if self._tnx:
self._tnx = False
try:
self._cnx.source().execute("ROLLBACK")
except Exception:
raise OperationalError("can't rollback")
else:
raise OperationalError("connection has been closed")
因此,我建议您将connections[instance].rollback()
来电替换为:
connections[instance]._tnx = False
connections[instance]._cnx.source().execute("ROLLBACK")
看看是否能为您提供更丰富的错误消息(pgdb中的except子句是贪婪的)。
另外:检查Postgresql日志,它可能已经记录了原因!
答案 2 :(得分:0)
您从哪里开始交易?我确实看到了一个COMMIT,但没有看到BEGIN或START TRANSACTION。