[TurboGears] メソッド全体をトランザクションに含める@transactionデコレータ

環境

この記事の内容は、TurboGears 1.0.1, SQLite 3.3.5で確認しました。

@transactionデコレータ

Rapid Web Applications with TurboGears: Using Python to Create Ajax-Powered Sites (Prentice Hall Open Source Software Development Series)

Rapid Web Applications with TurboGears: Using Python to Create Ajax-Powered Sites (Prentice Hall Open Source Software Development Series)

に、メソッド全体をトランザクション内に含めるデコレータが紹介されています。それの真似をして、さらに、トランザクションの隔離レベルを指定できる@transactionデコレータを作成しました。SQLiteに対応しています。

使い方

以下のようにして使います。

@transaction(isolation_level="EXCLUSIVE")
def foo(self):
    # ...
ソースコード

ソースコードは、以下の通りです。

from turbogears import decorator

def transaction(isolation_level=""):
    def entangle(func):
        def transaction(func, *args, **kw):
            trans = proj.model.hub.threadingLocal.connection
            trans._obsolete = False
            trans._connection = trans._dbConnection.getConnection()
            trans._connection.isolation_level = isolation_level
            try:
                returnval = func(*args, **kw)
                proj.model.hub.commit()
            except Exception, e:
                proj.model.hub.rollback()
                raise

            return returnval

        return transaction

    return decorator.weak_signature_decorator(entangle)