Postgres의 트랜잭션

2287 단어 databasepostgres
데이터베이스에서 트랜잭션은 단일 논리 단위입니다. 잠재적으로 여러 작업으로 구성될 수 있습니다. 예를 들어 은행 계좌에서 다른 계좌로 잔액을 이체하는 경우입니다. 트랜잭션에는 첫 번째 계정에서 금액을 제거한 다음 다른 계정에 추가해야 합니다. 계정에서 금액이 제거되고 프로그램이 실패하고 금액이 두 번째 계정에 추가되지 않는 것을 원하지 않을 것입니다. 이를 데이터베이스에서는 원자성이라고 합니다.

Postgres에서 모든 단일 문에는 문이 트랜잭션에서 발생한다는 개념이 내포되어 있습니다. 두 개의 간단한 UPDATE 문을 작성하면 다음과 같이 보일 수 있습니다.

UPDATE table1 SET column1 = 100.00
    WHERE id = 3;

UPDATE table1 SET column1 = 100.00
    WHERE id = 4;


그러나 이러한 UPDATE 문과 같은 문이 발생하면 다음과 같은 트랜잭션 내에서 발생한다고 생각할 수 있습니다.

BEGIN;
UPDATE table1 SET column1 = 100.00
    WHERE id = 3;
COMMIT;

BEGIN;
UPDATE table1 SET column1 = 100.00
    WHERE id = 4;
COMMIT;


트랜잭션 "블록"은 BEGINCOMMIT 명령 간에 실행되는 쿼리 집합입니다. 이러한 명령 중 하나를 지정하지 않으면 암시적으로 모든 명령을 둘러쌉니다.
BEGINCOMMIT 명령을 사용하여 다른 트랜잭션 블록을 지정하도록 이 기본 동작을 재정의할 수 있습니다. 아이디어는 데이터베이스에서 한 번에 여러 작업을 수행할 수 있다는 것입니다. 이는 중간 작업이 실패할 수 있는 경우 후속 명령을 실행하지 않으려는 경우에 유용합니다. 전체 "트랜잭션"이 발생하지 않습니다.

아래에서 이 스크립트에서 실제로 BEGINCOMMIT를 지정한 것을 볼 수 있습니다. 이제 트랜잭션 블록으로 이 두 가지가 데이터베이스에 "커밋"되고 동시에 표시됩니다.

BEGIN;
    UPDATE table1 SET column1 = 100.00
        WHERE id = 3;

    UPDATE table1 SET column1 = 50.00
        WHERE id = 4;
COMMIT;


이는 API 또는 기타 서비스가 첫 번째 문과 두 번째 문 사이에 데이터를 요청하고UPDATE 모든 데이터가 업데이트될 때까지 데이터에 액세스하지 않으려는 경우에도 유용할 수 있습니다. 단순UPDATE 명령문의 경우 대기 시간이 정말 느리지만 더 길고 복잡한 프로세스의 경우 이는 점점 더 중요해집니다.

또 다른 예: 테이블이 삭제되었지만 완전히 다시 채워질 때까지 테이블을 볼 수 없도록 하려면 다음을 수행하십시오.

BEGIN;
    CREATE TABLE table2 (
       column1 datatype(length) column_contraint,
       column2 datatype(length) column_contraint,
    );
    // add some data into table2

    DROP table table1;

    SELECT * INTO table1 FROM table2;

COMMIT;


롤백



마지막 트랜잭션 블록의 변경 사항을 롤백하거나 실행 취소하려면 ROLLBACK 명령을 사용할 수 있습니다. 이것은 개별 명령문을 순회하고 테이블을 수정한 방법을 파악하는 것이 정말 어려울 수 있기 때문에 매우 유용할 수 있습니다. 트랜잭션 블록의 모든 것을 래핑한 다음 롤백하면 블록에 있던 모든 것을 쉽게 실행 취소할 수 있습니다.

좋은 웹페이지 즐겨찾기