DML 문 및 트랜잭션 정보
DML(데이터 조작어) 문은 데이터베이스 테이블 데이터를 추가, 변경 및 삭제합니다. 트랜잭션은 Oracle AI Database가 하나의 단위로 취급하는 하나 이상의 SQL 문의 시퀀스입니다. 즉, 명령문을 모두 수행하거나 이들 중 하나도 실행하지 않았습니다.
트랜잭션 제어 명령문 정보
트랜잭션은 Oracle AI Database가 하나의 단위로 취급하는 하나 이상의 SQL 문의 시퀀스입니다. 즉, 명령문을 모두 수행하거나 이들 중 하나도 실행하지 않았습니다. 여러 작업을 하나의 단위로 수행해야 하는 비즈니스 프로세스를 모델링할 트랜잭션이 필요합니다.
예를 들어, 관리자가 회사를 떠나는 경우 관리자의 부재 시기를 표시할 행을 JOB_HISTORY 테이블에 삽입해야 하며, 해당 관리자에게 보고하는 모든 직원의 MANAGER_ID 값을 EMPLOYEES 테이블에서 갱신해야 합니다. 응용 프로그램에서 이 프로세스를 모델링하려면 INSERT 및 UPDATE 문을 단일 트랜잭션으로 그룹화해야 합니다.
기본 트랜잭션 제어 명령문은 다음과 같습니다.
-
SAVEPOINT: 나중에 롤백할 수 있는 지점인 트랜잭션에 저장점을 표시합니다. 저장점은 선택 사항이며 트랜잭션 하나에 여러 저장점을 사용할 수 있습니다.
-
COMMIT: 현재 트랜잭션을 종료하고, 변경 사항을 영구 적용하며, 저장점을 지우고, 잠금을 해제합니다.
-
ROLLBACK: 현재 트랜잭션 전체 또는 지정된 저장점 이후에 수행되는 변경 사항만 롤백(실행취소)합니다.
SQL*Plus 환경에서 SQL> 프롬프트가 표시된 후 트랜잭션 제어 명령문을 입력할 수 있습니다.
SQL Developer 환경에서 워크시트에 트랜잭션 제어 명령문을 입력할 수 있습니다. SQL Developer에는 "트랜잭션 커밋" 및 "트랜잭션 롤백"에 설명된 [변경 사항 커밋] 및 [변경 사항 롤백] 아이콘도 있습니다.
주의:
트랜잭션을 명시적으로 커밋하지 않은 상태와 프로그램이 비정상적으로 종료되면 데이터베이스는 커밋되지 않은 마지막 트랜잭션을 자동으로 롤백합니다.
응용 프로그램에서 트랜잭션을 커밋하거나 롤백하여 명시적으로 종료하는 것이 좋습니다.
참조:
-
트랜잭션 관리에 대한 자세한 내용은 Oracle AI Database Concepts를 참조하십시오.
-
트랜잭션 제어문에 대한 자세한 내용은 Oracle AI Database SQL Language Reference를 참조하십시오.
트랜잭션 커밋
트랜잭션을 커밋하면 변경 사항이 영구적으로 적용되며, 저장점이 지워지고, 잠금이 해제됩니다.
트랜잭션을 명시적으로 커밋하려면 COMMIT 문 또는 SQL Developer 환경의 경우 변경 사항 커밋 아이콘을 사용하십시오.
주: Oracle AI Database는 DDL(데이터 정의어) 문 전/후에 암시적인 COMMIT 문을 실행합니다. DDL 문에 대한 자세한 내용은 "DDL(데이터 정의어) 문 정보"를 참조하십시오.
트랜잭션을 커밋하기 전:
-
변경 사항은 본인에게만 표시되고 데이터베이스 인스턴스의 다른 사용자에게는 보이지 않습니다.
-
변경 사항이 최종이 아니므로 ROLLBACK 문을 사용하여 실행 취소할 수 있습니다.
트랜잭션을 커밋한 후:
-
변경 사항이 다른 사용자 및 트랜잭션을 커밋한 후 실행되는 다른 사용자의 명령문에 표시됩니다.
-
변경 사항이 최종이므로 ROLLBACK 문을 통해 실행 취소할 수 없습니다.
예제 3-1에서는 REGIONS 테이블에 행을 추가하고(매우 간단한 트랜잭션), 결과를 확인한 다음 트랜잭션을 커밋합니다.
예제 3-1 트랜잭션 커밋
트랜잭션 이전:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
4 rows selected.
트랜잭션(테이블에 행 추가):
INSERT INTO regions (region_id, region_name) VALUES (5, 'Africa');
결과:
1 row created.
추가된 행 확인:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
트랜잭션 커밋:
COMMIT;
결과:
Commit complete.
참조: COMMIT 문에 대한 자세한 내용은 Oracle AI Database SQL Language Reference
트랜잭션 롤백
트랜잭션을 롤백하면 변경 사항이 실행 취소됩니다. 현재 트랜잭션 전체를 롤백하거나 지정된 저장점에만 트랜잭션을 롤백할 수 있습니다.
현재 트랜잭션을 지정된 저장점에만 롤백하려면 TO SAVEPOINT 절과 함께 ROLLBACK 문을 사용해야 합니다.
현재 트랜잭션 전체를 롤백하려면 TO SAVEPOINT 절 없이 ROLLBACK 문을 사용하거나 SQL Developer 환경의 경우 변경 사항 롤백과 아이콘을 사용하십시오.
현재 전체 트랜잭션을 롤백합니다.
-
트랜잭션이 종료됨
-
모든 변경 사항이 취소됨
-
모든 저장점이 지워짐
-
모든 트랜잭션 잠금이 해제됨
지정된 저장점에만 현재 트랜잭션 롤백:
-
트랜잭션이 종료되지 않음
-
지정된 저장점 이후에 수행된 변경 사항만 취소됨
-
지정된 저장점 이후의 저장점 집합만 지워짐(지정된 저장점 자체는 제외됨)
-
지정된 저장점 이후에 확보한 모든 테이블 및 행 잠금이 해제됨
지정된 저장점 이후에 잠긴 행에 액세스를 요청한 다른 트랜잭션은 해당 트랜잭션이 커밋되거나 롤백될 때까지 계속 대기해야 합니다. 잠긴 행에 액세스를 요청하지 않은 다른 트랜잭션은 행에 액세스를 요청하여 즉시 액세스할 수 있습니다.
SQL Developer에서 롤백의 효과를 확인하려면 새로 고침 아이콘을 눌러야 합니다.
예 3-1의 결과에서와 같이, REGIONS 테이블에는 'Middle East and Africa'라고 하는 지역과 'Africa'라고 하는 지역이 있습니다, 예 3-2에서는 이 문제를 수정하고(매우 간단한 트랜잭션) 변경 사항을 확인한 다음 트랜잭션을 롤백하고 롤백을 확인합니다.
예 3-2 전체 트랜잭션 롤백
트랜잭션 이전:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
트랜잭션(테이블 변경):
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
결과:
1 row updated.
변경 사항 확인:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
트랜잭션 롤백:
ROLLBACK;
결과:
Rollback complete.
롤백 확인:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
참조: ROLLBACK 문에 대한 자세한 내용은 Oracle AI Database SQL Language Reference
트랜잭션에 저장점 설정
SAVEPOINT 문은 나중에 롤백할 수 있는 지점인 트랜잭션에 저장점을 표시합니다. 저장점은 선택 사항이며 트랜잭션 하나에 여러 저장점을 사용할 수 있습니다. 예제 3-3에서는 여러 개의 DML 문과 여러 개의 저장점을 포함하는 트랜잭션을 수행한 후 이 트랜잭션을 하나의 저장점에 롤백하여 저장점 이후 수행된 변경 사항만 실행 취소합니다.
예제 3-3 트랜잭션을 저장점으로 롤백
트랜잭션 전에 REGIONS 테이블 확인:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East and Africa
5 Africa
5 rows selected.
트랜잭션 전에 지역 4의 국가 확인:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
결과:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Nigeria NG 4
Zambia ZM 4
Zimbabwe ZW 4
6 rows selected.
트랜잭션 전에 지역 5의 국가 확인:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
결과:
no rows selected
여러 개의 저장점이 포함된 트랜잭션:
UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZM';
SAVEPOINT zambia;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'NG';
SAVEPOINT nigeria;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'ZW';
SAVEPOINT zimbabwe;
UPDATE COUNTRIES
SET REGION_ID = 5
WHERE COUNTRY_ID = 'EG';
SAVEPOINT egypt;
트랜잭션 후에 REGIONS 테이블 확인:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
트랜잭션 후에 지역 4의 국가 확인:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
결과:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Israel IL 4
Kuwait KW 4
2 rows selected.
트랜잭션 후에 지역 5의 국가 확인:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
결과:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 5
Nigeria NG 5
Zambia ZM 5
Zimbabwe ZW 5
4 rows selected.
ROLLBACK TO SAVEPOINT nigeria;
롤백 후에 REGIONS 테이블 확인:
SELECT * FROM REGIONS
ORDER BY REGION_ID;
결과:
REGION_ID REGION_NAME
---------- -------------------------
1 Europe
2 Americas
3 Asia
4 Middle East
5 Africa
5 rows selected.
롤백 후에 지역 4의 국가 확인:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;
결과:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Egypt EG 4
Israel IL 4
Kuwait KW 4
Zimbabwe ZW 4
4 rows selected.
롤백 후에 지역 5의 국가 확인:
SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;
결과:
COUNTRY_NAME CO REGION_ID
---------------------------------------- -- ----------
Nigeria NG 5
Zambia ZM 5
2 rows selected.
참조: SAVEPOINT 문에 대한 자세한 내용은 Oracle AI Database SQL Language Reference