2010-06-29 1 views
1

Pylons + SQLAlchemy에 문제가 있습니다. Pylons + SQLAlchemy problem : 트랜잭션이 서브 트랜잭션의 롤백으로 인해 비활성화되었습니다.

뭔가 잘못

는 (내 경우는 경쟁 조건으로 인해, 무결성 오류입니다) 데이터베이스 오류가 오류의 모든 다음 requestы 결과가 제기되고 발생 :

InvalidRequestError: The transaction is inactive due to a rollback in a subtransaction. Issue rollback() to cancel the transaction. 

내가 할 수있는 동안 이 원래 오류 (경쟁 조건)이 발생하는 것을 막을 수는 있지만보다 강력한 솔루션을 원합니다. 전체 오류를 방지하기 위해 하나의 오류가 발생하지 않도록하고 싶습니다.

가장 좋은 방법은 무엇입니까? Pylons에게 실패한 트랜잭션을 롤백하도록 알리는 방법이 있습니까?

답변

1

가장 쉬운 제거 컨트롤러에서 작업을 시작할 때 새로운 SQLAlchemy 세션을 사용하고 있는지 확인하는 것이 중요합니다. 세션을 취소합니다

def __before__(self): 
    model.Session.close() 

Session.close()를하고있을 경우 열려있는 모든 트랜잭션을 닫습니다 /project/lib/base.py에, BaseController하는 방법을 추가 할 수 있습니다. 세션을 사용할 때마다 컨트롤러에서 작업을 마쳤을 때 세션이 지워지도록하고 싶습니다. 컨트롤러가 요청을 처리하기 시작할 때 스레드의 이전 요청에 예외가 있고 롤백 대기중인 경우에도 요청이 항상 지워지는지 확인합니다.

+0

감사합니다. 이것은 트릭을 수행하는 것 같습니다. –

0

컨트롤러에 사용 하시겠습니까? yoursapp .lib.base. BaseController?

당신은 BaseController SA 세션에서 BaseController 또한 당신이 에서 SA 예외를 잡을 수 Handle mysql restart in SQLAlchemy

에서 시도 - 마지막으로 차단 할 세션 롤백()

을 볼 수는 http://www.sqlalchemy.org/docs/05/session.html#lifespan-of-a-contextual-session

+0

오, 고마워, 이제 세션이 각 요청 후에 remove()되고 있음을 알았습니다. 그런 다음 왜 다음과 같은 요청에서 오류가 발생합니까? –

+0

이 오류는 SA 세션을 다루는 모든 작업에서 발생합니까? – estin

+0

그래, 꽤 많이. 선택, 업데이트 ... 모든 요청이 실패합니다. –

관련 문제