[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 TRANSACTION
도 COMMIT
과 동일한 역할을 하며, 트랜잭션을 종료합니다.
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;