2011-08-20 3 views
3

방금 ​​Python 용 MySQLDb 패키지를 사용하여 배웠고 select 문에서 행을 가져 오는 것에 익숙합니다.실행 (sql) 후 fetchall()을 호출하면 데이터가 다시 읽습니까?

cursor.execute("SELECT movie_list_....") 
result = cursor.fetchall() 

첫 번째 명령을 실행할 때 영향을받는 행 수인 123L이 표시됩니다. 두 번째 명령을 실행하면 데이터가 실제로 반입됩니다.

내가 fetchall()을 수행하면이 존재하는 상태에서 이 DB를 다시 읽습니까?

나는 약에 대해 귀찮게 생각합니다. 나는 30 행에 영향을 미치는 select 연산을 실행했습니다. cursor.fetchmany (10)를 사용하여 한 번에 10 개씩 처리합니다. 그런 다음 10 개의 숫자를 더합니다 (예를 들어!). 첫 번째 두 번의 반복이 성공적으로 진행되었지만 세 번째 반복 전에에 영향을주는 테이블에서 업데이트가 실행되었습니다. 그런 다음 세 번째 반복이 발생합니다.

그래서 내 선택에을 선택했을 때 데이터베이스 이 반영됩니까? 아니면 오래된 가치와 새로운 가치가 혼합 된 것입니까?

나는 대학에서 "더러운 읽기 문제"라는 것을 기억합니다. 그러나 행을 모두 한 번에 읽는 맥락에서 은 fetchmany()와 같이 배치가이 아닙니다.

이 문제를 해결하는 데이터베이스 이론의 차이점을 알려주십시오.

답변

2

"정상적인"클라이언트 쪽 커서 또는 서버 쪽 커서를 사용하는지 여부에 따라 다릅니다.

내부적으로 클라이언트 측 클라이언트 (CS)는 mysql_store_result()이고 서버 측 클라이언트 (SS)는 mysql_use_result()입니다.

CS는 일반적으로 쿼리를 보낸 직후 모든 데이터를 가져 오므로 선호됩니다. 테이블이 해제 될 수 있기 때문에 서버에 대한 작업이 훨씬 적습니다. 따라서 서버가 인식하지 못하는 부분별로 데이터를 가져 오는 경우 모든 데이터가 로컬에 있고 쿼리 할 때 데이터 스냅 샷이 있습니다.

많은 데이터가 있거나 첫 번째 데이터를 빨리 표시하려는 경우 SS 방식을 사용할 수 있습니다. 그러나 당신은 데이터베이스에 대해 더 신경을 써야하고 별도의 스레드에서 데이터를 가져 와서 테이블에 모든 데이터가 저장 될 때까지 테이블이 열려 있고 잠겨 있기 때문에 가능한 빨리이 작업을 완료해야합니다. 보내고 가져 왔습니다. 따라서 읽기 도중 데이터 변경이 발생할 수는 없지만 테이블 잠금이 길어지기 때문에 다른 데이터베이스 사용자가 지연 될 수 있습니다.

+0

"데이터 조각을 조각으로 가져 오는 경우 서버가 인식하지 못합니다"설명하십시오. Didnt get all at – aitchnyu

+0

글쎄,이 경우 쿼리를 보내는 것은 내부적으로 mysql_store_result()를 호출하는 것을 의미한다. 이렇게하면 서버가 전체 결과 세트를 클라이언트에 보내어 처리 될 때까지 내부 결과를 유지합니다. (이 모든 일은 파이썬 밑의 C 레이어에서 발생합니다.) 따라서 서버를 방해하지 않고 오래되고 새로운 데이터를 혼합하지 않고 원하는만큼 데이터를 가져올 수 있습니다. – glglgl

관련 문제