English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PostgreSQL 트랜잭션

TRANSACTION(트랜잭션)은 데이터베이스 관리 시스템에서 실행 중인 과정의 하나로, 제한된 데이터베이스 작업 시퀀스로 구성되어 있습니다.

데이터베이스 트랜잭션은 일반적으로 데이터베이스를 읽는 시퀀스를 포함하고 있습니다/쓰기 작업입니다. 다음 두 가지 목적을 가지고 있습니다:

  • 데이터베이스 작업 시퀀스에 실패로부터 회복되는 방법을 제공하며, 데이터베이스가 예외 상태에서도 일관성을 유지할 수 있는 방법을 제공합니다。

  • 여러 애플리케이션이 동시에 데이터베이스에 접근할 때, 이러한 애플리케이션 간에隔離 방법을 제공하여 서로의 작업이 서로에게 영향을 미치지 않도록 할 수 있습니다。

거래가 데이터베이스 관리 시스템(DBMS)에 제출되면, DBMS는 거래 내의 모든 작업이 성공적으로 완료되고 결과가 데이터베이스에 영구적으로 저장되도록 보장해야 합니다. 거래 내의 일부 작업이 성공적으로 완료되지 않았다면, 거래 내의 모든 작업은 모두 되돌아가야 하며, 이는 거래 실행 전의 상태로 돌아갑니다. 동시에, 이 거래는 데이터베이스나 다른 거래의 실행에 영향을 미치지 않으며, 모든 거래는 독립적으로 실행되는 것처럼 보입니다。

거래의 속성

거래는 다음 네 가지 표준 속성을 가지고 있으며, 일반적으로 ACID로 약자로 사용됩니다:

  • 原子性(Atomicity):거래는 전체로 실행되며, 그 안에 포함된 데이터베이스의 작업은 모두 성공적으로 실행되거나 모두 실행되지 않아야 합니다。

  • 一致性(Consistency):거래는 데이터베이스의 상태가 일관된 상태에서 다른 일관된 상태로 변환되도록 보장해야 합니다. 일관된 상태의 의미는 데이터베이스의 데이터가 일관성 제약을 만족해야 한다는 것입니다。

  • 隔離性(Isolation):여러 거래가 동시에 실행될 때, 하나의 거래의 실행은 다른 거래의 실행에 영향을 미치지 않아야 합니다。

  • 지속성(Durability):제출된 거래가 데이터베이스에 대한 변경 사항은 데이터베이스에서 영구적으로 저장되어야 합니다。

예제

누군가가 상점에서 전자 화폐로 구매하려고 합니다100 원의 물건이 있으며, 그 중에서도 적어도 두 가지 작업이 포함되어 있습니다:

  • 그 사람 계정이 감소합니다 100 원。

  • 상점 계정이 증가합니다100 원。

거래를 지원하는 데이터베이스 관리 시스템은 위의 두 가지 작업(전체 "거래")이 모두 완료되거나 함께 취소되도록 보장해야 합니다. 그렇지 않으면 100 원이 무단으로 사라지거나 나타나는 경우。

거래 제어

거래를 제어하는 명령어는 다음과 같습니다:

  • BEGIN TRANSACTION:거래를 시작합니다。

  • COMMIT:거래 확인 또는 END TRANSACTION 명령어를 사용할 수 있습니다。

  • ROLLBACK:거래 되돌리기。

거래 제어 명령어는 INSERT, UPDATE, DELETE와 함께 사용됩니다. 이 명령어들은 테이블을 생성하거나 테이블을 제거할 때 사용할 수 없습니다. 왜냐하면 이러한 작업은 데이터베이스에서 자동으로 커밋되기 때문입니다.

BEGIN TRANSACTION 명령어

거래는 BEGIN TRANSACTION 명령어나 간단한 BEGIN 명령어로 시작할 수 있습니다. 이러한 거래는 일반적으로 다음 COMMIT 또는 ROLLBACK 명령어에 도달할 때까지 계속 실행됩니다. 그러나 데이터베이스가 닫혀거나 오류가 발생하면 거래 처리도 되돌아갑니다. 거래를 시작하는 간단한 문법은 다음과 같습니다:

BEGIN;
또는
BEGIN TRANSACTION;

COMMIT 명령어

COMMIT 명령어는 트랜잭션 호출의 변경을 데이터베이스에 저장하는 명령어입니다. 즉, 트랜잭션을 확인합니다.

COMMIT 명령어의 문법은 다음과 같습니다:

COMMIT;
또는
END TRANSACTION;

ROLLBACK 명령어

ROLLBACK 명령어는 데이터베이스에 저장되지 않은 트랜잭션 명령어를 취소하는 명령어입니다. 즉, 트랜잭션을 되돌립니다.

ROLLBACK 명령어의 문법은 다음과 같습니다:

ROLLBACK;

온라인 예제

COMMPANY 테이블 생성(COMMPANY SQL 파일 다운로드 ),데이터 내용은 다음과 같습니다:

w3codeboxdb# select * FROM COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

이제, 트랜잭션을 시작하여 age = 25 의 기록을 사용하여 최종적으로 ROLLBACK 명령어로 모든 변경을 취소했습니다.

w3codeboxdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;

COMMPANY 테이블을 확인하세요, 여전히 다음 기록이 있습니다:

 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

이제, 다른 트랜잭션을 시작하여 age = 25 의 기록을 사용하여 최종적으로 COMMIT 명령어로 모든 변경을 제출했습니다.

w3codeboxdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

COMMPANY 테이블을 확인하세요, 기록이 삭제되었습니다:

id | name  | age | address    | salary
----+-------+-----+------------+--------
  1 | Paul  |  32 | California |  20000
  3 | Teddy |  23 | Norway     |  20000
  5 | David |  27 | Texas      |  85000
  6 | Kim   |  22 | South-Hall |  45000
  7 | James |  24 | Houston    |  10000
(5 rows)