2016-08-06 2 views
0

"tasks"가 포함 된 MySQL 데이터베이스 테이블에 있습니다. 각 작업에는 깃발이 있습니다 (찍혔는지 아닌지).
그리고 이제 예를 들어 3 개 스레드가 수행SQL Alchemy 다중 스레드 SELECT FOR UPDATE가 작동하지 않습니다.

query_base = session.query(PredykcjaRow).filter(
    PredykcjaRow.predyktor == predictor, 
    PredykcjaRow.czy_wziete == False 
) 
query_disprot = query_base.join(NieustrRow, NieustrRow.fastaId == PredykcjaRow.fastaId) 

query_pdb = query_base.join(RawBialkoRow, RawBialkoRow.fasta_id == PredykcjaRow.fastaId) 
response = query_pdb.union(query_disprot) 
response = response.with_for_update() 
response = response.first() 
if response is None: 
    return None 
response.czy_wziete = True 
try: 
    session.commit() 
    return response 
except: 
    return None 

각 스레드는 자신의 세션 (ScopedSession)하지만 3 개 스레드가 동일한 개체를 얻을 수 있습니다. 구성

tx_isolation..... REPEATABLE-READ 

답변

0

문제는 노동 조합의 문입니다. MySQL은 FOR UPDATE와 함께 누적 SELECTS를 제공하지 않습니다. 경고없이 실행되지만 행은 잠기지 않습니다.
이 정보는 공식 문서에서 발견되었지만 지금은 찾을 수 없습니다. 누구나 할 수 있으면 의견을 게시하십시오.

0

범위 지정된 세션을 가정에서

는 다음과 같이 생성됩니다 :

Session = scoped_session(sessionmaker(bind=engine)) 

, 당신은 범위 세션이

session = Session() 
give_to_thread1(session) 
give_to_thread2(session) 

을하고 있지 않은지 확인하면 그것을 직접 사용할 수있다.

Session.query(...) 

그래서 스레드가이 작업을 수행해야합니다

def runs_in_thread(): 
    Session.add(...) 
    # or 
    session = Session() 
    session.add(...) 
+0

예, 저는 이렇게합니다 : evry 스레드 호출'scoped_session (session_factory)()' – Behoston

관련 문제