2014-11-10 3 views
1
는 (참고

: 이것은있다 "sqlite3를하고 멀티"라는 질문은하지만 문제는 실제로 약 멀티 스레딩이고 그래서 허용 대답은하지 않습니다 중복)멀티 프로세스 SQLite는 INSERT : "데이터베이스가 잠겨"

저는 다중 프로세스 스크립트를 구현하고 있습니다. 각 프로세스는 sqlite 테이블에 결과를 작성해야합니다. 내 프로그램은 database is locked (한 번에 하나의 DB 수정 만 허용되는 sqlite 사용)으로 계속 충돌합니다. 여기

내가 무슨의 예 : 나는 주에서 잠금을 선언하고 scan()에 글로벌로 사용하여 잠금을 사용하려고했습니다

def scan(n): 
    n = n + 1 # Some calculation 

    cur.execute("      \ 
        INSERT INTO hello \ 
        (n)    \ 
        VALUES ('"+n+"') \ 
       ") 

    con.commit() 
    con.close() 

    return True 


if __name__ == '__main__': 

    pool = Pool(processes=int(sys.argv[1])) 

    for status in pool.imap_unordered(scan, range(0,9999)): 
     if status: 
      print "ok" 

    pool.close() 

하지만 점점 저를 멈추지 않았다 database is locked.

하나의 INSERT 문만 다중 프로세스 Python 스크립트에서 동시에 발급되도록하는 올바른 방법은 무엇입니까?

편집 :

내가 데비안 기반 리눅스에서 실행하고 있습니다.

+0

운영 체제 란 무엇입니까? SQLite는 경쟁 저자 간의 경쟁을위한 자문/지역 잠금을 지원하므로 적절한 구성을 사용하여 적절한 운영 체제에서 한 번에 하나의 쓰기가 발생할 수 있지만이 작업이 아니라 다른 작성자가 느리게/막히는 결과를 초래합니다 . –

+0

자세한 내용은 http://www.sqlite.org/lockingv3.html에서 설명합니다. 특히 SQLite의 버전은 무엇입니까? 3.0 이전 버전 인 경우 (10 년이 넘은 경우),이 기능을 사용할 수 없습니다. –

+1

그런데 완전히 다른 메모에서 SQL 연결을 만들기 위해 문자열 연결을 사용하지 마십시오. 그 방법은 바비 테이블을 거짓말 ... –

답변

3

쓰기 잠금을 (기본적으로) 5 초 제한 시간 내에 잡을 수없는 경우에 발생합니다. 일반적으로 코드가 충분한 빈도로 트랜잭션을 커밋하여 잠금을 해제하고 다른 프로세스가이를 잡아낼 수 있도록하십시오. 더 오래 기다리려면 다음과 같이하십시오.

db = sqlite.connect(filename, timeout=30.0) 

... 30 초를 기다립니다.

+0

우수! 여러 개의 INSERT가있는 경우 각 사이에 잠금을 해제해야합니까? 또는 연속적으로 각각을 발행 한 다음 커밋을 수행합니까? – Juicy

+3

이상적으로 성능면에서 배치 크기면에서 합리적인 중간 지점을 찾고자합니다. 너무 짧고 전체적으로 시간이 너무 많이 걸리고 개별 거래가 너무 오래 걸릴 수 있습니다 (장기간 잠금 유지). 물론 때로는 정확성에 대한 우려가 성능보다 배치 크기를 더 강하게 요구합니다. –

관련 문제