Драйвер PostgreSQL для pgdb вызывает исключение «невозможно откатить» - PullRequest
1 голос
/ 10 марта 2010

по какой-то причине я испытываю сообщение «Операционная ошибка с сообщением« невозможно откат »» при попытке откатить транзакцию в следующем контексте:

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.

Что здесь в корне не так?

Ответы [ 3 ]

1 голос
/ 11 марта 2010

Вы смотрите не в том месте. Что говорит журнал PostgreSQL о том, что вы делаете?

0 голосов
/ 10 марта 2010

С чего начать транзакцию? Я вижу COMMIT, но не вижу НАЧАЛА или НАЧАЛА СДЕЛКИ.

0 голосов
/ 10 марта 2010

Что произойдет, если вы исключите оператор блокировки?

Это то, что происходит внутри 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 является жадным).

Кроме того: проверьте журнал Postgresql, возможно, он зарегистрировал причину!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...