트랜잭션 설명
트랜잭션은 단위로 처리되는 하나 이상의 T-SQL 문입니다. 단일 거래가 실패하면 모든 명령문이 실패합니다. 트랜잭션이 성공하면 트랜잭션의 모든 데이터 수정 문이 성공하고 데이터베이스에 커밋되었음을 알 수 있습니다.
트랜잭션은 트랜잭션 내의 모든 명령문이 성공하거나 모두 실패하는지 확인합니다. 부분 완료는 허용되지 않습니다. 트랜잭션은 단일 작업의 일부인 관련 테이블에 여러 항목과 같이 논리적으로 함께 발생해야 하는 작업을 캡슐화합니다.
Sales.Order 테이블에 구매를 저장하고 Sales.Payment 테이블에 결제를 저장하는 비즈니스를 고려합니다. 누군가가 뭔가를 구입하는 경우 두 테이블을 업데이트해야합니다. 트랜잭션 없이 구현되고 결제가 데이터베이스에 기록될 때 오류가 발생하면 Sales.Order 삽입이 계속 커밋되어 결제 테이블이 항목 없이 남습니다.
트랜잭션을 사용하여 구현되는 경우 두 항목이 모두 만들어지거나 항목이 만들어지지 않습니다. 테이블에 결제를 작성하는 동안 오류가 발생하면 주문 삽입도 롤백됩니다. 즉, 데이터베이스는 항상 일관된 상태입니다.
하드웨어 또는 네트워크 오류와 같은 심각한 오류를 의미합니다. SQL 문의 오류로 인해 특정 상황에서만 트랜잭션이 롤백되며 이 모듈의 후속 단위를 검토하여 트랜잭션 사용의 의미를 완전히 이해해야 합니다.
트랜잭션 유형은 다음과 같습니다.
명시적 트랜잭션
BEGIN TRANSACTION 키워드와 COMMIT 또는 ROLLBACK 키워드는 각 문 배치의 시작과 끝을 표시합니다. 이렇게 하면 함께 커밋하거나 롤백해야 하는 명령문을 지정할 수 있습니다.
암시적 트랜잭션
이전 트랜잭션이 완료되면 트랜잭션이 시작됩니다. 각 트랜잭션은 COMMIT 또는 ROLLBACK 문을 사용하여 명시적으로 완료됩니다.
ACID 특성
OLTP(온라인 트랜잭션 처리) 시스템에서는 트랜잭션이 "ACID" 특성을 충족해야 합니다.
- 원자성 – 각 트랜잭션은 완전히 성공하거나 완전히 실패하는 단일 단위로 처리됩니다. 예를 들어, 하나의 계좌에서 자금을 인출하여 동일한 금액을 다른 계좌에 예치하는 트랜잭션은 두 동작을 모두 완료해야 합니다. 두 동작 중 하나라도 완료할 수 없는 경우 나머지 동작도 실패해야 합니다.
- 일관성 – 트랜잭션은 데이터베이스의 데이터를 유효한 상태에서 다른 상태로만 사용할 수 있습니다. 위의 인출 및 예치 예로 돌아가 보면, 트랜잭션의 완료된 상태는 하나의 계좌에서 다른 계좌로의 자금 이체를 반영해야 합니다.
- 격리 – 동시 트랜잭션은 서로 간섭할 수 없으며 데이터베이스 상태가 일관되어야 합니다. 예를 들어 한 계정에서 다른 계정으로 자금을 이체하는 트랜잭션은 진행 중이지만 이러한 계정의 잔액을 확인하는 다른 트랜잭션은 일관된 결과를 반환해야 합니다. 잔액 검사 트랜잭션은 이전 전 잔액을 반영하는 한 계정에 대한 값을 검색할 수 없으며, 다른 계정에는 이전 후 잔액을 반영하는 값을 검색할 수 없습니다.
- 내구성 – 트랜잭션이 커밋된 경우 커밋된 상태로 유지됩니다. 계좌 이체 트랜잭션이 완료된 후에는 데이터베이스 시스템이 꺼지더라도 다시 켜진 후에는 커밋된 트랜잭션이 반영되도록 수정된 계좌 잔액이 지속되어야 합니다.