트랜잭션(Transaction)은 데이터베이스에서 논리적 연산 단위를 의미한다. 이는 밀접하게 관련된 여러 개의 데이터베이스 조작을 하나의 단위로 묶은 것이다. 트랜잭션은 최소 한 개 이상의 SQL 문장을 포함하며, 분리할 수 없는 최소의 단위로 취급된다. 즉, 트랜잭션은 전부 적용되거나 전부 취소되는 “All or Nothing”의 개념을 가진다.
계좌이체를 예시로 들어 설명하자면, 계좌이체에는 최소한 두가지 작업으로 구성된다.
이 두 작업이 모두 성공적으로 완료되어야 계좌이체가 성공적으로 종료된다. 만약 하나의 작업이라도 실패하면 전체 트랜잭션을 취소(롤백)하여 원래 상태로 되돌려야 한다. 이렇게 하는 이유는 일부 작업만 성공했을 경우 데이터의 일관성이 깨져 문제가 발생할 수 있기 때문이다.
트랜잭션을 제어하는 명령어로는 다음이 있다.
이 명령어들은 트랜잭션 제어 언어(TCL: Transaction Control Language)에 속한다.
트랜잭션은 다음과 같은 ACID 특성을 만족해야 한다.
잠금은 트랜잭션의 일관성과 격리성을 보장하기 위해 사용된다. 데이터베이스는 다양한 레벨의 잠금 기능을 제공하여 특정 데이터에 대해 다른 트랜잭션이 동시에 접근하지 못하도록 제한한다. 잠금이 걸린 데이터는 잠금을 수행한 트랜잭션만 독점적으로 접근할 수 있으며, 다른 트랜잭션은 해당 데이터에 접근할 수 없다. 잠금은 트랜잭션이 완료되거나 롤백될 때 해제된다.
잠금에는 여러 종류가 있다.
이러한 잠금 메커니즘을 통해 데이터베이스는 트랜잭션의 원자성과 일관성을 보장한다.
이와 같은 트랜잭션의 개념과 특성은 데이터베이스의 안정성과 신뢰성을 유지하는 데 중요한 역할을 한다.
COMMIT 명령어는 데이터베이스에서 트랜잭션의 변경 사항을 영구적으로 반영하는 데 사용된다. 이를 통해 입력, 수정, 삭제 등의 작업이 확정되어 다른 사용자들도 변경된 내용을 볼 수 있게 된다.
COMMIT 명령어가 실행되기 전의 데이터 상태는 다음과 같다.
INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('1997035', 'K02', '이운재', 'GK', 182, 82, 1);
-- 1개의 행이 만들어졌다.
COMMIT;
-- 커밋이 완료되었다.
UPDATE PLAYER SET HEIGHT = 100;
-- 480개의 행이 수정되었다.
COMMIT;
-- 커밋이 완료되었다.
DELETE FROM PLAYER;
-- 480개의 행이 삭제되었다.
COMMIT;
-- 커밋이 완료되었다.
COMMIT 명령어가 실행된 후의 데이터 상태는 다음과 같다.
SQL Server에서는 기본적으로 AUTO COMMIT 모드가 활성화되어 있어 DML 문장이 성공적으로 수행되면 자동으로 COMMIT이 실행된다. 반면, 오류가 발생하면 자동으로 ROLLBACK이 수행된다.
SQL Server 예제는 다음과 같다.
INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('1997035', 'K02', '이운재', 'GK', 182, 82, 1);
-- 1개의 행이 만들어졌다.
UPDATE PLAYER SET HEIGHT = 100;
-- 480개의 행이 수정되었다.
DELETE FROM PLAYER;
-- 480개의 행이 삭제되었다.
SQL Server는 기본적으로 3가지 트랜잭션 방식을 지원한다.
COMMIT 명령어는 데이터베이스 트랜잭션의 중요한 요소로, 트랜잭션의 변경 사항을 확정하여 데이터베이스에 반영합니다. 이는 데이터 일관성과 무결성을 유지하는 데 중요한 역할을 합니다. Oracle과 SQL Server는 각각의 방식으로 COMMIT을 처리하며, 트랜잭션 제어 방법에도 차이가 있습니다.
ROLLBACK 명령어는 데이터베이스에서 트랜잭션의 변경 사항을 취소하고, 데이터를 이전 상태로 복구하는 데 사용다. COMMIT 이전에 입력, 수정, 삭제한 데이터를 되돌릴 수 있다.
INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);
-- 1개의 행이 만들어졌다.
ROLLBACK;
-- 롤백이 완료되었다.
UPDATE PLAYER SET HEIGHT = 100;
-- 480개의 행이 수정되었다.
ROLLBACK;
-- 롤백이 완료되었다.
DELETE FROM PLAYER;
-- 480개의 행이 삭제되었다.
ROLLBACK;
-- 롤백이 완료되었다.
SQL Server에서는 기본적으로 AUTO COMMIT 모드를 사용하므로, 명시적으로 ROLLBACK을 수행하려면 트랜잭션을 선언해야 합니다.
BEGIN TRAN
INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);
-- 1개의 행이 만들어졌다.
ROLLBACK;
-- 롤백이 완료되었다.
BEGIN TRAN
UPDATE PLAYER SET HEIGHT = 100;
-- 480개의 행이 수정되었다.
ROLLBACK;
-- 롤백이 완료되었다.
BEGIN TRAN
DELETE FROM PLAYER;
-- 480개의 행이 삭제되었다.
ROLLBACK;
-- 롤백이 완료되었다.
COMMIT과 ROLLBACK 명령어는 데이터베이스 트랜잭션을 제어하는 중요한 도구로, 데이터 일관성과 무결성을 보장하고 오류를 방지하는 데 필수적이다.
SAVEPOINT 명령어는 트랜잭션 내에서 특정 지점을 저장하여, 필요한 경우 해당 지점까지 롤백할 수 있도록 한다. 이는 복잡한 트랜잭션에서 부분적인 롤백을 가능하게 하여 에러가 발생한 부분만 수정할 수 있도록 도와준다.
ROLLBACK을 실행하면 모든 변경 사항이 취소되고 트랜잭션 시작 위치로 돌아간다.SAVEPOINT SVPT1;
-- 저장점이 생성되었다.
INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);
-- 1개의 행이 만들어졌다.
ROLLBACK TO SVPT1;
-- 롤백이 완료되었다.
SAVEPOINT SVPT2;
-- 저장점이 생성되었다.
UPDATE PLAYER SET WEIGHT = 100;
-- 480개의 행이 수정되었다.
ROLLBACK TO SVPT2;
-- 롤백이 완료되었다.
SAVEPOINT SVPT3;
-- 저장점이 생성되었다.
DELETE FROM PLAYER;
-- 480개의 행이 삭제되었다.
ROLLBACK TO SVPT3;
-- 롤백이 완료되었다.
SQL Server에서는 SAVE TRANSACTION 명령어를 사용하여 동일한 기능을 수행할 수 있다.
BEGIN TRAN
SAVE TRAN SVTR1;
-- 저장점이 생성되었다.
INSERT INTO PLAYER (PLAYER_ID, TEAM_ID, PLAYER_NAME, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('1999035', 'K02', '이운재', 'GK', 182, 82, 1);
-- 1개의 행이 만들어졌다.
ROLLBACK TRAN SVTR1;
-- 롤백이 완료되었다.
BEGIN TRAN
SAVE TRAN SVTR2;
-- 저장점이 생성되었다.
UPDATE PLAYER SET WEIGHT = 100;
-- 480개의 행이 수정되었다.
ROLLBACK TRAN SVTR2;
-- 롤백이 완료되었다.
BEGIN TRAN
SAVE TRAN SVTR2;
-- 저장점이 생성되었다.
UPDATE PLAYER SET WEIGHT = 100;
-- 480개의 행이 수정되었다.
ROLLBACK TRAN SVTR2;
-- 롤백이 완료되었다.
Oracle과 SQL Server 모두 특정 조건에서 자동으로 트랜잭션을 종료한다.
SAVEPOINT 명령어는 복잡한 트랜잭션 내에서 부분 롤백을 가능하게 하여 데이터 무결성과 일관성을 유지하는 데 중요한 역할을 한다. Oracle과 SQL Server 모두 이러한 기능을 제공하며, 트랜잭션 관리의 유연성을 높여준다.