더 이상 나눌 수 없는 가장 작은 작업의 단위를 의미한다. 개발자가 따로 설정하지 않았다면, 하나의 명령은 하나의 트랜잭션이 된다.
모든 작업을 독립성을 보장해서 하나씩 순차적으로 진행하도록 한다면, 명령이 많을 수록 CPU는 응답시간이 점점 길어지기 때문에 프로그램이 비효율적으로 동작하게 된다. 따라서 데이터베이스의 무결성과 동시성의 성능을 위해 개발자가 따로 트랜잭션의 경계를 설정해야 한다. 즉, 여러개의 명령을 묶어 하나의 트랜잭션으로 만들어 주어야 한다.
데이터의 유효성을 보장하기 위해 사용되는 트랜잭션의 특징들의 앞 글자를 딴 것이다.
Atomicity(원자성)
트랜잭션은 모든 명령이 모두 성공되거나 전부 실패해야 한다는 성질
Consistency(일관성)
어떤 컬럼의 속성 등이 변경된다면, 트리거에 의해 모든 데이터베이스에 일괄적으로 적용되어야 한다는 성질
Isolation(독립성)
트랜잭션 수행 시 다른 트랜잭션이 끼어들 수 없고, 독립적으로 실행되야 한다는 성질
Durability(지속성)
트랜잭션이 성공적으로 수행되었다면, 어떠한 문제가 발생하더라도 데이터베이스에 그 내용이 영원히 지속되어야 한다는 성질
BEGIN TRAN
UPDATE accounts
SET balance = balance - 10000
WHERE user = '구매자';
UPDATE accounts
SET balance = balance + 10000
WHERE user = '판매자';
COMMIT TRAN
첫 쿼리를 쿼리처리기를 통해 넣고 필요한 데이터를 데이터 캐시에서 찾아본 뒤 없다면 데이터 파일에서 데이터를 가져와서 데이터 캐시에 로드된다.
데이터를 변경하기 전에 redo, undo 로그를 기록해야 한다. 만약 트랜잭션의 어떤 문제가 생긴다면 ROLLBACK을 위해 undo로그를 사용하고, 만약 os문제, 정전, 컴퓨터 전원이 꺼짐 등 예상치 못한 오류가 생겼을 경우 redo로그를 통해서 데이터들을 일관성있게 만들어주고 그 데이터 중 COMMIT이 안된 데이터들은 undo로그를 통해서 이전상태로 되돌린다.
데이터를 변경 후 다음 쿼리를 다시 실행
위와 같은 순서를 반복 후 COMMIT으로 트랜잭션 성공
출처 : 테코톡