2011-04-27 3 views
13

어제 저는 경쟁 조건을 피하기 위해 "select ... for update"개념을 필요로하는 일부 sqlalchemy 항목으로 작업하고있었습니다. 쿼리에 .with_lockmode('update')를 추가하면 InnoDB의와 포스트 그레스에 치료를 작동하지만 SQLite는 대한 내가 선택을 수행하기 전에sqlalchemy에서 트랜잭션 동작을 업데이트하기 위해 sqlite select를 적용하는 방법

if session.bind.name == 'sqlite': 
    session.execute('begin immediate transaction') 

에 몰래하는 것을 끝낸다.

이것은 현재는 효과가있는 것처럼 보이지만 부정 행위로 느껴집니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

+0

'NullPool'이외의 연결 풀인 경우 필요합니다. 또는 다른 방법으로, dsn이'sqlite : /// : memory :'일 때? – SingleNegationElimination

답변

7

SELECT ... FOR UPDATE OF ...는 지원되지 않습니다. 모든 비트를 업데이트 할 때 전체 데이터베이스가 잠기므로 행 잠금이 중복되는 에서 SQLite의 메커니즘을 고려하면 이해할 수있는 을 이해할 수 있습니다. 그러나 향후 버전의 SQLite가 SQL interchageability 이유로 SQL을 지원한다면 좋을 것입니다. 기능이 아직 없으면 데이터베이스에 "예약 된"잠금이 설정되어 있어야합니다. http://sqlite.org/cvstrac/wiki?p=UnsupportedSql

에서

발췌 난 당신이 전체 데이터베이스에 대한 액세스를 동기화하는 것 같아요. 정상적인 동기화 메커니즘은 파일 잠금, 프로세스 동기화 등에도 적용해야합니다.

+1

최신 링크 : http://sqlite.org/isolation.html. 요약, 요점 1을 참조하십시오 : SQLite의 트랜잭션은 SERIALIZABLE입니다. – michauwilliam

관련 문제