2017-11-15 10 views
0

은 내가 데이터를 당겨, 대형 테이블을 통해 반복하는 동안 나는 매우 큰 테이블을포스트 그레스 & psycopg 서버 쪽 커서 : 데이터가 잠겨 있습니까?

cursor = conn.cursor('name_of_the_new_server_side_cursor') 
cursor.execute(""" SELECT * FROM table LIMIT 10000000 """) 

while True: 
    rows = cursor.fetchmany(5000) 
    if not rows: 
     break 

    for row in rows: 
     # do something with row 
     pass 

을 읽을 수 있도록 내 포스트 그레스에 DB를 서버 쪽 커서를 만들 psycopg을 사용하려면, 행이 될 수 있습니다 내 쿼리가 실행되는 동안 다른 프로세스/쿼리에 의해 업데이트되거나 추가 되었습니까? 그렇다면 내 커서가 테이블을 반복하면서 쿼리가 처음 실행될 때와 같이 업데이트/새 데이터 또는 데이터가 표시됩니까? 예를 들어, 처음 50K 행의 데이터를 가져 오면 행 51201로 업데이트됩니다. 내 커서가 50,000에서 55,000 행의 데이터를 가져 오도록 내 쿼리에서 업데이트 된 폼 또는 원래 폼으로 행을 반환합니다. ? 새로운 행이 다른 프로세스에 의해 추가되면, 내 쿼리는 새로운 행을 반환하거나 cursor.execute 문을 처음 실행했을 때의 상태로 테이블을 반환합니까?

답변

0

The Documentation regarding autocommit says:

는 기본적으로 간단한 SELECT를 포함한 모든 쿼리 실행, 트랜잭션을 시작합니다 : 추가적인 조치를 취하지 않으면 장기 실행 프로그램, 세션이 "거래에서 유휴 상태"로 유지됩니다, 몇 가지 이유로 바람직하지 않은 조건 (잠금은 세션에 의해 유지되고 테이블은 부풀어 오른다.).

그래서 select는 다른 모든 트랜잭션과 동일한 잠금을가집니다. 당신이 저장에서 그 일을 더 잘 할 수

conn.set_session(readonly=True, autocommit=True) 

을하지만 처리하기 위해 찾고 있다면/데이터를 업데이트 :

방금 ​​데이터를 읽을 당기는 경우에, 당신은 설정하여 해결을 시도 할 수 데이터베이스에있는 proc을 정확하게 찾으려면 어떻게해야할까요?