나는 다음과 같은 쿼리를 반복하고 수행하는 데몬에 스레드가 :Sqlalchemy orm 세션에서 올바르게 캐싱을 사용하지 않도록 설정하는 방법?
절전 방법은 단지 구성 시간이 스레드 및 메인 루프에 return 문 반환의 실행을 중지try:
newsletter = self.session.query(models.Newsletter).\
filter(models.Newsletter.status == 'PROCESSING').\
limit(1).one()
except sa.orm.exc.NoResultFound:
self.logger.debug('No PROCESSING newsletters found. Sleeping...')
self.sleep()
return
# (...) more code to do with found newsletter
. 그러나 데몬이 실행되는 동안 뉴스 레터의 상태를 'PROCESSING'으로 변경하면 아무 일도 일어나지 않습니다. 쿼리는 여전히 NoResultFound를 발생시킵니다. 그러나 데몬을 다시 시작하면 뉴스 레터를 찾을 수 있습니다. 따라서이 쿼리의 결과는 캐시되어야합니다. 캐시를 무효화하려면 어떻게해야합니까? session.expire_all()이 작동하지 않습니다. 모든 반복마다 새 Session() 객체를 만들 수도 있지만 시스템 리소스와 관련하여 좋은 접근 방식인지는 알 수 없습니다.
나쁜 가정. 데이터베이스가이 두 트랜잭션을 어떻게 직렬화하는지 알고 있습니까? 이 두 트랜잭션에 어떤 데이터베이스 잠금이 관련되어 있는지 알고 있습니까? SQLAlchemy 캐시를 어떻게 알 수 있습니까? 쿼리가 잘못된 잠금을 제거하기 때문에 쿼리가 완료 될 때까지 업데이트를 방해하는 데이터베이스 잠금이 될 가능성이 있습니다. 캐싱에 대한 증거가 있습니까? 아니면 추측입니까? –
나는 증거가 없다. 그냥 추측. 어쩌면 캐싱이 다른 곳에서 이루어질 수도 있습니다. 롤백() 사용은 여기에서 작동하는 것 같습니다. – zefciu
** 캐싱이 아닌 ** 잠금 인 경우가 많습니다. –