我们正在使用SQLAlchemy声明性基础,并且我有一个方法,我想要隔离事务级别。简单来说,有两个进程同时写入数据库,我必须让它们在事务中执行其逻辑。默认的事务隔离级别是READ COMMITTED,但我需要能够使用SERIALIZABLE隔离级别执行一段代码。
使用SQLAlchemy如何实现这一点?现在,我基本上有一个在我们的模型中的方法,它继承自SQLAlchemy的声明性基础,需要以事务方式调用。
使用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
我这样做是为了使用事务隔离级别来调用它,但它没有按照我预期的那样运行。从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)
create_engine()
函数的isolation_level
参数似乎只影响主连接管理器,因此您会在每个连接上获得该隔离级别。您是否找到了一种与连接池兼容的方法,在每个会话/连接基础上实现这一点?根据您最初的问题,似乎您只想在某种特定的方法上使用它。 - Russ