如何在SQLAlchemy中为PostgreSQL设置事务隔离级别?

Mah*_*der 10 python postgresql transactions sqlalchemy isolation-level

我们正在使用SQLAlchemy声明基础,我有一个方法,我想隔离事务级别.为了解释,有两个进程同时写入数据库,我必须让它们在事务中执行它们的逻辑.默认事务隔离级别是READ COMMITTED,但我需要能够使用SERIALIZABLE隔离级别执行一段代码.

这是如何使用SQLAlchemy完成的?现在,我基本上在我们的模型中有一个方法,它继承自SQLAlchemy的声明性基础,基本上需要以事务方式调用.

from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
from psycopg2.extensions import ISOLATION_LEVEL_READ_COMMITTED
from psycopg2.extensions import ISOLATION_LEVEL_SERIALIZABLE

class OurClass(SQLAlchemyBaseModel):

    @classmethod
    def set_isolation_level(cls, level=ISOLATION_LEVEL_SERIALIZABLE):
        cls.get_engine().connect().connection.set_isolation_level(level)

    @classmethod
    def find_or_create(cls, **kwargs):
        try:
            return cls.query().filter_by(**kwargs).one()
        except NoResultFound:
            x = cls(**kwargs)
            x.save()
            return x
Run Code Online (Sandbox Code Playgroud)

我这样做是为了使用事务隔离级别来调用它,但它没有按照我的预期进行.隔离级别仍然是我在postgres日志中看到的READ COMMITTED.有人可以帮助确定我做错了什么吗?

我正在使用SQLAlchemy 0.5.5

class Foo(OurClass):

    def insert_this(self, kwarg1=value1):
        # I am trying to set the isolation level to SERIALIZABLE
        try:
            self.set_isolation_level()
            with Session.begin():
                self.find_or_create(kwarg1=value1)
        except Exception:  # if any exception is thrown...
            print "I caught an expection."
            print sys.exc_info()
        finally:
            # Make the isolation level back to READ COMMITTED
            self.set_isolation_level(ISOLATION_LEVEL_READ_COMMITTED)
Run Code Online (Sandbox Code Playgroud)

Mah*_*der 10

来自MichaelAlber,SQLAlchemy的维护者:

请使用create_engine()的"isolation_level"参数 并使用SQLAlchemy最新提示, 直到发布0.6.4,因为最近修复了关于隔离级别的psycopg2特定错误.

下面的方法不会影响稍后用于查询的相同连接 - 您将使用PoolListener在所有连接创建时设置set_isolation_level.

  • 似乎`create_engine()`的`isolation_level`参数只会影响主连接管理器,因此您可以在每个连接上获得该隔离级别.您是否找到了基于连接池兼容的方法来实现每个会话/连接?您的原始问题似乎只是想要某种方法. (3认同)