我們正在使用SQLAlchemy聲明基礎,並且我有一個方法要隔離事務級別。爲了解釋,有兩個進程同時寫入數據庫,我必須讓他們在事務中執行邏輯。默認事務隔離級別是READ COMMITTED,但我需要能夠使用SERIALIZABLE隔離級別執行一段代碼。如何在SQLAlchemy for PostgreSQL中設置事務隔離級別?
這是如何使用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 2010-12-14 02:58:43