Поддержка транзакций в скрученном adbapi

Я пытаюсь понять, как работают транзакции в модуле adbapi для скрученных. В настоящее время я использую runOperation ()для выполнения инструкций INSERT и UPDATE. Документация, на которую я дам ссылку ниже, показывает, что она поддерживает транзакции, но не так, как хотелось бы. Вот пример кода (, который работает внутри веб-сервера Cyclone, но, надеюсь, это не относится к делу):

class OperationHandler(cyclone.web.RequestHandler):
    @cyclone.web.asynchronous
    def get(self, *args, **kwargs):
        d = conn.runOperation("INSERT INTO Table1 (Field1, Field2) VALUES ('a', 'b')")
        d.addCallback(self.next1)

    def next1(self, rows):
        d = conn.runOperation("UPDATE Table1 SET Field1 = 'c'")
        d.addCallback(self.next2)

    def next2(self, rows):
        raise Exception("rollback")
        self.finish("done")

В этом случае, несмотря на то, что в последнем обратном вызове возникло исключение, выполняются как оператор INSERT, так и оператор UPDATE. Не то, что я хочу.

Я попытался преобразовать, чтобы использовать метод runInteraction (), но я не уверен, что делаю это правильно.

class InteractionHandler(cyclone.web.RequestHandler):
    @cyclone.web.asynchronous
    def get(self, *args, **kwargs):
        d = conn.runInteraction(self.someTransaction)
        d.addCallback(self.done)

    def someTransaction(self, txn):
        txn.execute("INSERT INTO Table1 (Field1, Field2) VALUES ('a', 'b')")
        txn.execute("UPDATE Table1 SET Field1 = 'c'")
        txn.execute("UPDATE Table1 SET Field1 = 'd'")

        raise Exception("rollback")

    def done(self, rows):
        print rows
        self.finish("done")

В этом случае я получаю желаемый эффект, при котором все откатывается, но, как видите, код совсем другой. Вместо объединения обратных вызовов в цепочку, где каждый обратный вызов выполняет один запрос, я просто выполняю все в одном большом методе.

Нужно ли это делать для поддержки транзакций?

Вот ссылки на документацию:

http://twistedmatrix.com/documents/current/core/howto/rdbms.html

http://twistedmatrix.com/documents/12.0.0/api/twisted.enterprise.adbapi.ConnectionPool.html#runInteraction

6
задан d512 18 July 2012 в 16:40
поделиться