Мы используем декларативную базу SQLAlchemy, и у меня есть метод, для которого я хочу изолировать уровень транзакции. Чтобы объяснить, есть два процесса, которые одновременно записываются в базу данных, и я должен заставить их выполнить свою логику в транзакции. Уровень изоляции транзакции по умолчанию - READ COMMITTED, но мне нужно выполнить кусок кода, используя уровни изоляции SERIALIZABLE.Как установить уровень изоляции транзакций в SQLAlchemy для 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
Я делаю это, чтобы использовать это, используя уровень изоляции транзакции, но это не делает то, что я ожидаю. Уровень изоляции по-прежнему READ COMMITTED из того, что я вижу в журналах postgres. Может ли кто-нибудь помочь определить, что я делаю?
Я использую 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)
Кажется, что аргумент 'isol_level'' create_engine() 'влияет только на главный диспетчер соединений, поэтому вы получаете этот уровень изоляции для каждого соединения. Вы определили способ объединения соединений с пулом для достижения этого на основе сеанса/соединения? Ваш оригинальный вопрос казался вам, что вы только хотели его по определенному методу. – Russ