데이터 조작어
💡 트랜잭션은 논리적 작업 단위를 형성하는 DML문의 모음으로 구성됨
- 테이블에 새 행 추가
- 테이블의 기존 행 수정
- 테이블에서 기존 행 제거
새 행 삽입
- 각 열에 대한 값을 포함하는 새 행 삽입
- 테이블에 있는 열의 기본 순서로 값 나열
- 선택적으로 INSERT 절에 열 나열
테이블의 행 갱신
- WHERE 절이 지정된 경우 UPDATE 문은 특정 행의 값을 수정
- WHERE 절을 생략하면 테이블의 모든 행에서 값이 수정
테이블에서 행 삭제
💡 WHERE 절을 지정하여 특정 행 삭제 WHERE 절을 생략하면 테이블의 모든 행 삭제
다른 테이블을 기반으로 행 삭제
💡 DELETE 문에서 쿼리를 사용하여 다른 테이블의 값을 기반으로 테이블에서 행 제거
TRUNCATE 문
💡 DDL문이며 롤백 정보를 생성 X 테이블 자르기는 테이블의 삭제 트리거를 유발 X
데이터베이스 트랜잭션
- 데이터를 일관성 있게 변경하는 여러 DML 문
- 하나의 DDL 문
- 하나의 DCL 문
유형 | 설명 |
DML | 단일 엔티티나 논리적 작업 단위로 취급하는 임의 개수의 DML문으로 구성됨 |
DDL | 하나의 DDL 문으로만 구성 |
DCL | 하나의 DCL 문으로만 구성 |
데이터베이스 트랜잭션: 시작과 종료
💡 COMMIT 또는 ROLLBACK 문 실행
DDL 또는 DCL 문 실행 (자동 커밋)
유저가 SQL Developer 또는 SQL * plus를 종료
시스템 중단
COMMIT 및 ROLLBACK 문의 이점
- 데이터 일관성 보장
- 변경 사항을 영구 적용하기 전에 데이터 변경 사항 검토
- 논리적으로 관련된 작업 그룹화
명령문 | 설명 |
COMMIT | 보류 중인 모든 데이터 변경 사항을 영구적으로 적용하여 현재 트랜잭션을 종료 |
SAVEPOINT NAME | 트랜잭션 내에 저장점 표시 |
ROLLBACK | 보류 중인 모든 데이터 변경 사항을 폐기하여 현재 트랜잭션 종 |
ROLLBACK TO SAVEPOINT NAME | 트랜잭션을 지정된 저장점으로 롤백 |
롤백 중인 저장점 이후에 생성된 변경 사항 및/ 또는 저장점은 폐기됨 |
암시적 트랜잭션 처리
💡 다음 상황에서 자동 커밋 발생
- DDL 문 실행
- DCL 문 실행
- COMMIT 또는 ROLLBACK 문을 명시적으로 실행하지 않은 채 SQL 종료
상태 | 상황 |
자동 커밋 | DDL 또는 DCL 문 실행 |
자동 롤백 | SQL Developer 또는 SQL*PLUS가 비정상적으로 종료되거나 시스템 Failure가 발생 |
COMMIT 또는 ROLLBACK 이전의 데이터 상태
- 이전의 데이터 상태 복구
- 현재 유저는 SELECT 문을 사용하여 DML 작업 결과 확인
- 다른 유저는 현재 유저가 실행한 DML문의 결과 확인 X
- 영향을 받는 행이 잠기므로 다른 유저가 영향을 받는 행의 데이터 변경 X
COMMIT 후의 데이터 상태
- 데이터 변경 사항이 데이터베이스에 저장
- 이전의 데이터 상태 겹쳐씀
- 모든 유저가 결과를 확인할 수 있음
- 영향을 받는 행의 잠금이 해제되어 이러한 행을 다른 유저가 조작 가능
- 모든 저장점이 지워짐
ROLLBACK 후의 데이터 상태
- 데이터 변경 사항 언두
- 이전의 데이터 상태 복원
- 영향 받는 행의 잠금 해제
명령문 레벨 롤백
- 실행 중 단일 DML문에 오류가 발생하면 해당 명령문만 롤백
- Oracle 서버는 암시적 저장점 구현
- 다른 모든 변경 사항 보존
- 유저가 COMMIT 또는 ROLLBACK문을 실행하여 트랜잭션 명시적으로 종료
읽기 일관성
💡 항상 데이터를 일관성 있게 볼 수 있음
- 한 유저가 변경한 사항이 다른 유저가 변경한 사항과 충돌하지 않음
- 읽는 사람은 쓰는 사람의 작업이 완료되기를 기다릴 필요 X
- 쓰는 사람은 읽는 사람의 작업이 완료되기를 기다릴 필요 X
- 쓰는 사람은 다른 쓰는 사람의 작업이 완료되길 기다려야 함