PostgreSQL의 트랜잭션은`psycopg2`를 통해 커서 또는 연결별로 이루어 집니까?


10

psycopg2데이터베이스 API를 사용하여 PostgreSQL 9.3에서 작업하고 있습니다.

DB API를 최소 격리 수준 ( "자동 커밋"모드)으로 설정했으며 SQL을 통해 직접 자체 트랜잭션을 관리하고 있습니다. 예:

cur = self.conn.cursor()
cur.execute("BEGIN;")
cur.execute("SELECT dbId, downloadPath, fileName, tags FROM {tableName} WHERE dlState=%s".format(tableName=self.tableName), (2, ))
ret = cur.fetchall()
cur.execute("COMMIT;")

기본적으로 시작된 트랜잭션은 cur.execute("BEGIN;")해당 커서로만 제한 self.conn.cursor()됩니까 , 아니면 전체 연결 ( )에 해당합니까?

내가하고있는 더 복잡한 작업 중 일부는 논리적으로 기능으로 분류되는 여러 개의 개별 데이터베이스 작업과 관련이 있습니다. 이것은 모두 멤버로 연결된 클래스에 있기 때문에 각 함수 내에서 커서를 만드는 것이 훨씬 편리합니다. 그러나 트랜잭션 에서 커서를 만드는 방법이 확실하지 않습니다 .

기본적으로 트랜잭션이 연결별로 이루어지는 경우 트랜잭션 내에서 즉시 많은 커서를 만들 수 있습니다. 그들이 커서 당이라면, 나는 커서를 모든 곳에서 통과시켜야한다는 것을 의미합니다. 무엇 이니?

당신이 호출 할 수 있다는 사실은 비록 문서는, 이것에 접촉하지 않는 connection.commit()나를 만드는 공정 거래 제어가 당 연결입니다 확신합니다.

답변:


7

트랜잭션은 세션마다, 즉 연결마다입니다.

PostgreSQL은 트랜잭션 일시 중지 및 재개를 지원하지 않으므로 psycopg2는 암시 적으로 새로운 연결을 생성하지 않는 한 트랜잭션 단위로 만들 수 없었습니다.

실제로 psycopg2의 커서는 특히 유용하지 않습니다. 서버에서 증분 가져 오기를 사용하지 않는 경우 결과 세트를 유지할 수 있지만 그 밖의 다른 것들에는 적합하지 않습니다.

왜 수동으로 발행 begin하고 commit있지만, 오히려 그들을 위해 연결 방법을 사용하는 것보다?


문서의 AFICT에 따르면 전체 "DB API"모델은 명시 적 트랜잭션을 전혀 지원하지 않습니다.
가짜 이름

1
@FakeName 명시 적으로 할 필요는 없습니다 begin. 열려있는 트랜잭션이 없으면 새 트랜잭션이 시작됩니다. 당신은 commit거래를 묘사하기 위해서입니다. 그렇습니다. DB-API 모델 명시 적 트랜잭션을 지원합니다.
Craig Ringer

1
DB API가 특별히 지시하지 않고 자동으로 수행하는 경우 이는 매우 암시 적 시작입니다. (I 질문에 명시된 바와 같이), 나는 자동 커밋 모드를 사용하고 있기 때문에 나는 때문에 게다가, 그것은, 무관의 원하지 않는 사람들 자동으로 BEGIN문을. 에 psycopg2대해 새 거래를 만들고 싶지 않습니다 SELECT.
가짜 이름

TL; DR 기본적으로 A. 나는 그렇게 미쳤고 B. 디버깅에 많은 도움이되기 때문에 진행중인 모든 트랜잭션의 정확한 범위를 알고 싶습니다.
가짜 이름

1
이상한 버그가 나타나는 것에 놀라지 않을 것입니다. AFAIK 자동 커밋은 실제로 수동 트랜잭션 관리가 아닌 자동 커밋을 의미합니다 . 트랜잭션 범위를 수동으로 관리하려는 경우 추가 사항 BEGIN은 무해하며 PostgreSQL을 사용하여 무시됩니다 WARNING: there is already a transaction in progress.
Craig Ringer

1

로부터 psycopg2의 문서 :

Psycopg에서 트랜잭션은 연결 클래스에 의해 처리됩니다. 기본적으로 명령이 데이터베이스로 처음 전송 될 때 (연결에 의해 작성된 커서 중 하나를 사용하여) 새 트랜잭션이 작성됩니다. 다음 데이터베이스 명령은 동일한 트랜잭션의 컨텍스트에서 실행됩니다. 첫 번째 커서가 발행 한 명령뿐만 아니라 동일한 연결로 작성된 모든 커서가 발행 한 명령입니다. 명령이 실패하면 트랜잭션이 중단되고 rollback () 메소드를 호출 할 때까지 추가 명령이 실행되지 않습니다.

동시에, 버전 2.4.2부터는 autocommit속성 (강조 추가)이 있습니다.

읽기 / 쓰기 속성 :이면 True드라이버가 트랜잭션을 처리하지 않고 백엔드로 전송 된 모든 명령문이 즉시 적용됩니다. False 첫 번째 명령 실행에서 새 트랜잭션이 시작된 경우 : 트랜잭션을 종료하려면 메소드 commit()또는 rollback()수동으로 호출해야합니다.

자동 커밋 모드는 같은 트랜잭션 외부에서 실행되도록 요구하는 명령을 실행하는 데 유용 CREATE DATABASE또는 VACUUM.

디폴트는 FalseDBAPI 스펙에 따라 (수동 확약)입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.