-
SQL - 트랜잭션 제어와 세션DataBase/Oracle 2023. 9. 4. 12:51
1. 하나의 단위로 데이터를 처리하는 트랜잭션
1.1 트랜잭션이란?
- 더 이상 분할할 수 없는 최소 수행 단위를 뜻한다.
- 하나의 작업 또는 밀접하게 연관된 작업을 수행하기 위해 한 개 이상의 데이터 조작어로 이루어진다.
- 트랜잭션은 하나의 트랜잭션 내에 있는 여러 명령어를 한 번에 수행하여 작업 완료 or 모든 작업 취소한다.
(이를 트랜잭션의 ALL OR NOTHING 원자성이라고도함)
- 이러한 트랜잭션을 제어하는 명령어를 TCL이라고 한다.
- 트랜잭션은 SCOTT같은 데이터베이스 계정을 통해 접속하는 동시에 실행된다.
- 트랜잭션이 종료되기 전까지 여러 SQL문을 실행하고 트랜잭션 제어하는 TCL을 실행할 때 기존 트랜잭션이 끝난다.
2. 트랜잭션을 제어하는 명령어
- 하나의 트랜잭션에 묶여 있는 데이터 조작어의 수행 상태는 수행 완료 혹은 수행 취소 두 가지 상태로만 존재할 수 있다.
- 즉 데이터 조작을 데이터 베이스에 영구히 반영 혹은 전체 취소한다.
2.1 트랜잭션을 취소하고 싶을 때 ROLLBACK
INSERT INTO DEPT_TCL VALUES (50,'DATABASE','SEOUL'); UPDATE DEPT_TCL SET LOC = 'BUSAN' WHERE DEPTNO = 40; DELETE FROM DEPT_TCL WHERE DNAME = 'RESEARCH'; ROLLBACK;
2.2 트랜잭션을 영원히 반영하고 싶을 때 COMMIT
-롤백과 달리 트랜잭션 명령어를 데이터 베이스에 영구히 반영
INSERT INTO DEPT_TCL VALUES (50,'NETWORK','SEOUL'); UPDATE DEPT_TCL SET LOC = 'BUSAN' WHERE DEPTNO = 20; DELETE FROM DEPT_TCL WHERE DEPTNO = 40; COMMIT;
- COMMIT 이후에는 새로운 트랜잭션이 실행된다.
- DDL은 자동으로 트랜잭션이 종료됨
- savepoint를 지정해서 롤백 위치를 지정할 수도 있다.
UPDATE DEPT_TCL SET LOC = 'JEJU' WHERE DEPTNO = 50; savepoint P1; UPDATE DEPT_TCL SET LOC = 'SEOUL' WHERE DEPTNO = 30; ROLLBACK to P1;
3. 세션과 읽기 일관성의 의미
3.1 세션이란
- 일반적으로 세션은 어떤 활동을 위한 시간 혹은 기간을 의미한다.
- 오라클 DB에서 세션은 DB접속 시작으로 DB 관련 작업을 수행한 후 접속을 종료하기까지 전체 기간을 의미합니다.
- 세션이 여러개라는 말은 DB 사용 중인 연결이 여러 개 있다는 뜻입니다.
* 세션은 접속,connection을 의미하기도함
3.2 읽기 일관성의 중요성
- 데이터베이스는 여러 곳(여러 사용자, 여러 응용 프로그램)에서 동시에 접근하여 관리 및 사용하는 것이 목적이므로
대부분 많은 세션이 동시에 연결되어 있다.
- 읽기 일관성이란 어떤 세션에서 테이블 데이터 변경 중일 때 다른 세션에서는 변경 사항을 알 필요가 없으므로, 변경 중인 세션 외 나미지 세션에서는 진행 중인 변경과 무관한 본래의 데이터를 보여주는 특성을 의미한다.
*SQL-Developer 외 cmd창을 통해 SQL-PLUS를 실행시켜서 새로운 접속을 만들어서 실습해보자
--sqldeveloper update dept_TCL set loc='seoul' where deptno=30; select * FROM DEPT_TCL; --SQLPLUS SELECT * FROM DEPT_TCL;
- 두 결과는 다르다. 트랜잭션이 각각 따로 유지되기 때문이다.
- sql-developer에서 commit을 한 뒤에 다시 sql-plus에서 확인해보면 결과가 잘 반영된 것을 볼 수 있다.
* 같은 아이디로 접속했지만, 두개는 다른 세션이다. (같은 아이디로 인증받은 것 뿐, DB는 다른 세션으로 인식)
* 접속하는 단위에 따라 세션 구분 -> sql디벨로퍼 여러개 켜도 다른 세션 (각각 다른 connetion 생성된다고 봅시다)
4. 수정 중인 데이터 접근을 막는 LOCK
4.1 LOCK란?
- 트랜잭션이 완료되기 전까지 다른 세션에서 조작할 수 없는 상태가 된다.
- 조작 중인 데이터를 다른 세션은 조작할 수 없도록 접근을 보류시키는 것을 뜻한다.
4.2 LOCK 개념 살펴보기
* LOCK을 sql-plus와 sql-developer를 통해 실습해보자
--sql-developer update dept_TCL set loc='ooo' where deptno=30;
- 한 세션에서 update한 뒤에 commit이 이루어지지 않았음으로, 다른 세션은 update를 반영하지 못하고 대기
- 한 쪽에서 commit이 완료되면, 후에 다른 세션 작업이 반영된다.
4.3 LOCK 종류
- 행 레벨 락(row level lock): SQL을 통해 조작하는 대상 데이터가 테이블의 특정 행 데이터일 경우 해당 행만 LOCK
- 테이블 레벨 락(table level lock): WHERE절을 지정하지 않은 UPDATE,DELETE 등에 발생
- 테이블 레벨 락 발생시 다른 세션이 UPDATE,DELETE 수행 불가
- 타 세션 DDL사용불가
- INSERT문은 사용가능
* 실무에서 데이터 관련 작업을 할 때 실제 서비스에 사용하는 운영 DB에 바로 작업 수행하는 경우 흔치 않다. 대부분 테스트 혹은 개발 전용 DB에서 시험 삼아 테스트해 본 후에 문제가 없으면 실제 운영 중인 DB에 적용한다.
'DataBase > Oracle' 카테고리의 다른 글
SQL - 제약 조건 (0) 2023.09.05 SQL - 데이터 정의어 (DDL) (0) 2023.09.04 SQL - DML (0) 2023.09.01 오라클 sql - 인라인 뷰를 사용한 TOP-N SQL (0) 2023.09.01 SQL 레벨업 (1) DBMS 아키텍처 (0) 2023.08.31