<<트랜잭션>>
데이터베이스의 일관성과 안전성을 보장하기 위해 사용
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 |
댓글