DB/etc

DB 트랜잭션

sshhhh 2023. 10. 5.

<<트랜잭션>>

데이터베이스의 일관성과 안전성을 보장하기 위해 사용

1.원자성 (Atomicity)
- 트랜잭션은 하나의 원자적인 작업 단위로 간주됩니다. 
- 모든 작업은 전부 실행되거나 전혀 실행되지 않아야 합니다. 
- 트랜잭션 내의 하나의 작업이 실패하면 모든 작업이 롤백되어 이전 상태로 복원됩니다. 
*이를 통해 데이터의 일관성을 유지할 수 있습니다.

2.일관성 (Consistency)
- 트랜잭션은 데이터베이스의 일관성을 보장합니다. 
- 트랜잭션을 통해 정의된 작업은 데이터베이스의 미리 정의된 규칙과 제약 조건을 준수해야 합니다. 
- 트랜잭션을 사용하면 데이터베이스의 일관성을 유지할 수 있습니다.

3.고립성 (Isolation)
- 트랜잭션은 서로 간섭하지 않고 독립적으로 실행됩니다. 
- 동시에 실행 중인 다른 트랜잭션의 작업에 영향을 받지 않습니다. 
*이를 통해 데이터의 무결성과 안정성을 보장할 수 있습니다.

4.지속성 (Durability)
- 트랜잭션이 성공적으로 커밋되면 해당 작업은 영구적으로 저장됩니다. 
- 데이터의 변경은 디스크에 지속적으로 기록되어 시스템 장애 또는 전원 이중화와 같은 예기치 않은 상황에서도 데이터의 손실을 방지합니다.

 

<<트랜잭션의 격리 수준>>

각 격리 수준은 동시성과 데이터 일관성 사이의 트레이드오프를 나타냅니다. 
더 높은 격리 수준은 데이터 일관성을 보장하지만 동시에 다른 트랜잭션 간의 충돌 가능성이 높아집니다. 
선택할 격리 수준은 데이터의 일관성과 동시성 요구사항에 맞춰 결정해야 합니다.

1.READ UNCOMMITTED (커밋되지 않은 읽기):
- 다른 트랜잭션이 수정 중인 데이터에도 접근 가능
- Dirty Read(더티 리드), Non-repeatable Read(반복 불가능한 리드), Phantom Read(팬텀 리드) 문제 발생
- 다른 트랜잭션에 의해 수정된 데이터를 바로 읽을 수 있으나, 데이터의 일관성과 정확성에 대한 보장이 제한적

2.READ COMMITTED (커밋된 읽기):
- 다른 트랜잭션이 커밋한 데이터에만 접근이 가능
- Dirty Read(더티 리드)는 허용되지 않지만 Non-repeatable Read(반복 불가능한 리드), Phantom Read(팬텀 리드) 문제 발생
- 데이터의 일관성을 보장하기 위해 다른 트랜잭션의 변경사항을 대기하고, 커밋된 데이터만 읽어오는 방식

3.REPEATABLE READ (반복 가능한 읽기):
- 트랜잭션이 시작될 때 읽은 데이터를 일관성 있게 유지
- Non-repeatable Read(반복 불가능한 리드)는 허용되지 않지만 Phantom Read(팬텀 리드) 문제가 발생

4.SERIALIZABLE (직렬화):
- 동시에 실행되는 트랜잭션 간에 완전한 격리를 제공하여 일관성과 격리성 보장
- Dirty Read(더티 리드), Non-repeatable Read(반복 불가능한 리드), Phantom Read(팬텀 리드) 문제가 발생하지 않습니다.

 

 

🍩 트랜잭션

try-catch 작성하여 아래 오류 안뜨게함
ROLLBACK TRANSACTION 요청에 해당하는 BEGIN TRANSACTION이 없습니다.
(작업할 수 없는 내용을 실행했을때 뜨는 오류

BEGIN TRY
	BEGIN TRAN --트랜잭션시작
	SET TRANSACTION ISOLATION LEVEL READ COMMITTED -- 트랜잭션 격리 수준 설정
	
	--INSERT INTO TBL_SH2 VALUES ('이름3',11,'주소7',1,1,2)
	DELETE FROM TBL_SH2 WHERE NAME='이름4'

	COMMIT -- 트랜잭션의 모든 변경 사항을 영구적으로 저장하고 트랜잭션을 성공적으로 종료
	--ROLLBACK  --모든 변경 사항을 취소
END TRY

BEGIN CATCH --예외 발생시
    ROLLBACK;  -- 트랜잭션 롤백
END CATCH;

SELECT * FROM TBL_SH2

성공

롤백하면 삭제 안됨

DELETE문 작성할때 쓰면 유용함

 

 

++예외처리

BEGIN TRY
    -- 실행하려는 SQL 문장
    -- 예를 들어, 데이터베이스에서 데이터를 조회하거나 업데이트하는 SQL을 실행

    -- 예시: 데이터 조회
    SELECT * FROM YourTable WHERE ColumnName = 'SomeValue';

    -- 예시: 데이터 업데이트
    -- UPDATE YourTable SET ColumnName = 'NewValue' WHERE AnotherColumn = 'SomeCondition';
END TRY
BEGIN CATCH
    -- 오류가 발생했을 때 실행되는 블록
    -- 오류 메시지를 처리하거나 로깅할 수 있음

    -- ERROR_MESSAGE(): 발생한 오류 메시지를 가져옴
    -- ERROR_NUMBER(): 오류 번호를 가져옴
    -- ERROR_STATE(): 오류 상태를 가져옴
    -- ERROR_PROCEDURE(): 오류가 발생한 저장 프로시저 이름을 가져옴
    -- ERROR_LINE(): 오류가 발생한 라인 번호를 가져옴

    -- 예시: 오류 메시지 출력
    PRINT '오류 발생: ' + ERROR_MESSAGE();

    -- 예시: 오류 로깅
    -- INSERT INTO ErrorLog (ErrorMessage, ErrorNumber, ErrorState, ErrorProcedure, ErrorLine)
    -- VALUES (ERROR_MESSAGE(), ERROR_NUMBER(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE());
END CATCH;

 

 

'DB > etc' 카테고리의 다른 글

MSSQL OPTION(RECOMPILE)  (1) 2023.10.05
매핑 테이블(mapping table)  (1) 2023.10.05
DB 인덱스 INDEX  (1) 2023.10.05
ORACLE, MYSQL ERD 생성  (0) 2023.09.13
DB - 엔티티, 테이블의 차이  (0) 2023.09.12

댓글