2012-03-22 3 views
2

나는 이런 식으로 뭔가를하고 싶지 :이 있지 않은 경우 즉PostgreSQL - 트랜잭션이 원 자성을 보장합니까?

SELECT * FROM TABLE where *condition* 
... TEST for a row being returned 
IF NOT 
    INSERT the row 

가 난 단지 테이블에 행을 삽입 할. 내 관심사는 결과 집합을 테스트하는 동안 행이 실제로 다른 프로세스에 의해 삽입 될 수 있다는 것입니다. 나는 이것을 알지 못할 것이고 두 개의 행이 삽입 될 것이다. 나는 이것을 원하지 않는다.

나는 거래 내에서 두 문장을 래핑하는 것을 생각했지만 이것이 대답이 아닌 것으로 의심된다. 트랜잭션이 실행되는 동안 테이블을 잠그는 것과 비슷한 효과가 있는지 여부를 모르므로 SELECT와 INSERT 사이의 다른 삽입을 방지 할 수 있습니까? 이것이 문제입니다.

가장 좋은 방법은 단순히 행의 열에 고유 키를 설정하여 중복 삽입을 방지하는 것입니다. 그러나 나는 여전히 거래를 사용하는 것에 대한 나의 생각이 모두 유효하거나 사납게 떨어져 있는지 궁금합니다.

답변

5

데이터베이스는 원 자성을 보장합니다. 그러나 원자력이 당신의 생각을 의미하지 않기 때문에 이것은 도움이되지 않습니다. DB는 일련의 작업을 전혀 수행하지 않거나 전혀 수행하지 않을 것이라고 말합니다.

  • 일관성
  • 절연
  • 내구성을

    • 자성

    링크 된 위키 백과을 읽어야 할 사람 :

    는 DB의 사람들이 항상 약 ACID 의미가 이야기하는 이유입니다 article과 PostgreSQL 매뉴얼의 Transaction Isolation 장, whi ch는 또한 PostgreSQL의 모든 맥락을 설명합니다.

    아, 기본적으로 ACI가 필요합니다. 고유 인덱스를 사용하지 않으려면 삽입하기 전에 전체 테이블에 대해 테이블 ​​잠금을 수행해야합니다. 그래서 인덱스는 가장 간단하고 강력한 솔루션입니다.