logo

[SQLite] 트랜잭션

SQLite에서 트랜잭션은 여러 데이터베이스 작업을 하나의 단위로 묶어서 전체가 성공적으로 완료되거나 실패할 경우 이전 상태로 롤백되도록 보장하는 기능입니다. 트랜잭션을 사용하면 데이터의 일관성과 무결성을 유지할 수 있습니다.

 

BEGIN TRANSACTION

트랜잭션을 시작하기 위해 BEGIN TRANSACTION 문을 사용합니다. SQLite에서는 BEGIN, BEGIN TRANSACTION, BEGIN [TRANSACTION TYPE] 형태로 사용할 수 있습니다.

  • Deferred: 트랜잭션이 시작될 때 데이터베이스에 대한 잠금을 즉시 획득하지 않습니다. 필요할 때(처음 읽기 또는 쓰기를 시도할 때) 잠금을 획득합니다. 이는 기본 트랜잭션 모드입니다.
  • Immediate: 트랜잭션이 시작될 때 쓰기 작업을 위한 잠금을 즉시 획득합니다. 다른 연결이 읽기는 가능하지만 쓰기는 불가능합니다.
  • Exclusive: 트랜잭션이 시작될 때 데이터베이스에 대한 전용 잠금을 획득하여 다른 어떤 연결도 읽기나 쓰기를 할 수 없게 합니다.
BEGIN DEFERRED;
BEGIN IMMEDIATE;
BEGIN EXCLUSIVE;
 

COMMIT과 END

COMMIT 문은 트랜잭션 내에서 수행된 모든 변경사항을 데이터베이스에 영구적으로 적용합니다. END TRANSACTIONCOMMIT과 동일한 역할을 하며, 트랜잭션을 종료합니다.

BEGIN;
UPDATE Employees SET Department = 'Marketing' WHERE EmployeeID = 1;
COMMIT;
 

ROLLBACK

ROLLBACK 문은 트랜잭션 내에서 이루어진 모든 변경사항을 취소하고, 트랜잭션을 시작하기 이전의 상태로 데이터베이스를 되돌립니다.

BEGIN;
DELETE FROM Employees WHERE Department = 'HR';
ROLLBACK;

위 예시에서는 HR 부서의 모든 직원 데이터를 삭제하려고 했지만, ROLLBACK을 통해 모든 변경사항을 취소하고 원래 상태로 되돌립니다.

 

SAVEPOINT

SAVEPOINT는 트랜잭션 내에서 특정 지점을 표시하는데 사용됩니다. 이를 통해, 해당 지점 이후에 발생하는 변경사항들을 선택적으로 롤백할 수 있습니다.

먼저, BEGIN 명령을 사용하여 트랜잭션을 시작하고, SAVEPOINT 명령으로 중간 지점을 설정합니다.

BEGIN TRANSACTION;
-- 직원 테이블에 대한 변경 사항 1
UPDATE Employees
SET Department = 'Marketing'
WHERE Department = 'Sales';

SAVEPOINT sp1;

위 코드는 트랜잭션을 시작하고, Employees 테이블의 일부 데이터를 업데이트한 후, sp1이라는 이름의 SAVEPOINT를 설정합니다.

SAVEPOINT 설정 이후에 추가적인 데이터 변경사항을 적용합니다.

-- 직원 테이블에 대한 변경 사항 2
DELETE FROM Employees WHERE Department = 'HR';

이 코드는 HR 부서의 모든 직원을 삭제하는 추가 변경사항입니다.

ROLLBACK TO SAVEPOINT 명령을 사용하여 해당 지점 이후의 변경사항만 취소할 수 있습니다.

ROLLBACK TRANSACTION TO SAVEPOINT sp1;

이제 변경 사항을 추가하고, 새로운 SAVEPOINT를 설정합니다.

-- 직원 테이블에 대한 변경 사항 3
DELETE FROM Employees WHERE Department = 'HR';
SAVEPOINT sp2;

SAVEPOINT 이후의 변경사항을 확정하려면 RELEASE SAVEPOINT 명령을 사용합니다.

RELEASE SAVEPOINT sp2;

이 명령은 sp2 SAVEPOINT 이후의 모든 변경사항을 트랜잭션에 확정합니다. 이 시점 이후에 ROLLBACK을 수행하더라도, sp2 이전에 이루어진 변경사항은 롤백되지 않습니다.

마지막으로, 트랜잭션 내의 모든 변경사항을 데이터베이스에 반영하기 위해 COMMIT 명령을 사용합니다.

COMMIT;
Previous
WITH (CTE)