SQL 통한 Database 관리

rollback to savepoint

JBS 12 2024. 8. 29. 20:59

`ROLLBACK TO SAVEPOINT`는 SQL에서 트랜잭션의 특정 저장점(SAVEPOINT)으로 되돌아가는 명령어입니다. 이 명령어를 사용하면 지정한 저장점 이후에 수행된 모든 작업이 취소됩니다. 그러나 저장점 이전에 수행된 작업은 유지됩니다.

### 주요 사용 사례

- **부분적인 오류 처리**: 트랜잭션을 수행하는 도중에 예상치 못한 오류가 발생했을 때, 전체 트랜잭션을 취소하지 않고 특정 저장점 이후의 작업만 되돌리고 싶을 때 사용합니다.
- **조건부 작업 취소**: 트랜잭션 내에서 특정 조건이 만족되지 않으면 일부 작업만 취소하고, 나머지 작업은 유지하고자 할 때 유용합니다.

### 구문

```sql
ROLLBACK TO SAVEPOINT savepoint_name;
```

- `savepoint_name`: 이전에 정의한 `SAVEPOINT`의 이름입니다. 이 지점으로 트랜잭션이 되돌아갑니다.

### 예제

1. **트랜잭션 시작**:
   ```sql
   BEGIN TRANSACTION;
   ```

2. **첫 번째 작업 수행**:
   ```sql
   INSERT INTO accounts (account_id, balance) VALUES (1, 1000);
   ```

3. **저장점 설정**:
   ```sql
   SAVEPOINT sp1;
   ```

4. **두 번째 작업 수행**:
   ```sql
   INSERT INTO accounts (account_id, balance) VALUES (2, 2000);
   ```

5. **오류 발생 또는 조건 불만족**:
   - 이 시점에서 문제가 발생했다고 가정합니다.
  
6. **저장점으로 롤백**:
   ```sql
   ROLLBACK TO SAVEPOINT sp1;
   ```
   - 이 명령어를 실행하면 `sp1` 저장점 이후의 작업(즉, `account_id`가 `2`인 행의 삽입)이 취소됩니다. `account_id`가 `1`인 행의 삽입은 그대로 유지됩니다.

7. **나머지 작업 수행**:
   ```sql
   INSERT INTO accounts (account_id, balance) VALUES (3, 3000);
   ```

8. **트랜잭션 커밋 (확정)**:
   ```sql
   COMMIT;
   ```

### 주요 특징

- **저장점 이후의 작업만 취소**: `ROLLBACK TO SAVEPOINT`는 저장점 이후의 작업만 취소합니다. 전체 트랜잭션을 롤백하지 않습니다.
- **저장점 이전의 작업은 유지**: 저장점 이전의 작업은 그대로 유지되며, 트랜잭션 내에서 계속 이어질 수 있습니다.

### 결론

`ROLLBACK TO SAVEPOINT`는 트랜잭션 중 발생할 수 있는 오류를 세밀하게 처리하고, 필요한 경우 일부 작업만 되돌리는 데 매우 유용한 도구입니다. 이를 통해 데이터베이스의 무결성을 유지하면서 복잡한 트랜잭션을 관리할 수 있습니다.

'SQL 통한 Database 관리' 카테고리의 다른 글

values ()  (0) 2024.08.29
savepoint ?  (0) 2024.08.29
update set  (0) 2024.08.29
GROUP BY 예시  (0) 2024.08.29
groupby 가 어떻게 실행되는지 예시로 알려줘  (0) 2024.08.29