2010-03-19 4 views
1

Postgres (psycopg) 연결로 작업 할 때 '자동 커밋'이라는 개념을 더 잘 이해하려고합니다. 이제 내가 새로운 연결을 가정 해 봅시다/롤백 방법을 시작 커서를 사용하지 않고, 다음, 직접 SQL을 실행 ISOLATION_LEVEL_AUTOCOMMIT과의 격리 수준을 설정 (연습으로, 나는 실제로 이렇게 할 말을하지 않음) :BEGIN이 자동 커밋 모드의 연결에서 실행될 때 Postgres는 무엇을합니까?

INSERT A 
INSERT B 
BEGIN 
    INSERT C 
    INSERT D 
ROLLBACK 

INSERT C & D에 어떤 일이 발생합니까?

autocommit은 BEGIN을 발행하는 방법에 영향을주는 psycopg의 내부 설정입니까? 이 경우 위의 SQL은 인식되지 않습니다. INSERT A & B는 완료되면 즉시 커밋되며 C & D는 트랜잭션에서 실행되고 롤백됩니다. 해당 트랜잭션은 어떤 격리 수준에서 실행됩니까?

아니면 연결 자체에서 자동 설정을 자동 연결합니까? 이 경우 BEGIN 처리에 어떤 영향을 줍니까? 무시할 수 있습니까? 아니면 실제로 트랜잭션을 시작하기 위해 autocommit 설정을 덮어 씁니까? 해당 트랜잭션은 어떤 격리 수준에서 실행됩니까?

아니면 완전히 벗어 났습니까?

+0

http://www.postgresql.org/docs/8.4/static/sql-begin.html –

답변

3

자동 커밋 모드는 각 명령문이 암시 적으로 트랜잭션을 시작하고 종료 함을 의미합니다. 자동 커밋이 꺼져있는 경우 경우

는 :

  • 클라이언트는 암시 적으로 첫 번째 문에 대한 트랜잭션을 시작합니다
  • BEGIN 트랜잭션이 이미 시작을 알리는 경고를 발행합니다
  • ROLLBACK은 4 개의 모든 문을 롤백합니다.

자동 커밋이 설정되면 c과 0 만은 롤백됩니다.

PostgreSQL에는 8.0부터 내부 AUTOCOMMIT 동작이 없으므로 모든 자동 커미트 기능은 클라이언트에 의존합니다.

+0

자동 커밋이 설정된 경우의 동작에 대해 묻습니다. – DNS

+0

@DNS : Postgres 문서를 살펴보십시오 (위 질문에 대한 주석과 링크 됨). 자동 커밋이 켜져있을 때의 동작을 명확하게 알려줍니다. –

+0

@ar : 그렇지 않습니다. 실행하면 어떤 일이 일어나는지 설명합니다. 즉, * BEGIN없이 INSERT를 모두 수행합니다. 그것은 간단합니다. 제 질문은 BEGIN + ROLLBACK/COMMIT 블록 내에서 * 실행될 때 자동 커밋 모드로 설정된 psycopg 연결의 동작에 대해 묻습니다. – DNS

1

기본적으로 PostgreSQL에는 자동 커밋이 설정되어있어 각 구문이 트랜잭션으로 처리됩니다. 예를 들어 명시 적으로 트랜잭션을 시작하도록 지시하면 해당 항목이 새 트랜잭션에 있습니다.

예에서 A와 B는 커밋되고 C와 D는 롤백됩니다.

1

자동 커밋이 psycopg에있을 때 트랜잭션을 관리하지 않고 PostgreSQL 백엔드로 모든 것을 전송합니다. BEGIN/COMMIT/ROLLBACK을 사용하지 않으면 모든 .execute() 호출이 즉시 실행되고 커밋됩니다. BEGIN/COMMIT/ROLLBACK 명령을 발행하여 자신의 트랜잭션 관리를 수행 할 수 있습니다. 분명한 것은 autocommit 모드에서 connycmit()이나 conn.rollback()을 호출 할 수 없다는 것입니다. 왜냐하면 psycopg는 트랜잭션을 추적하지 않고 단지 .execute()를 백엔드로 바로 전송하기 때문입니다.

예에서 A와 B가 커밋되면 C와 D가 롤백됩니다.