SQL 통한 Database 관리

savepoint ?

JBS 12 2024. 8. 29. 21:00

`SAVEPOINT`는 SQL에서 트랜잭션 내에서 특정 시점(저장점)을 설정하는 기능을 제공하는 명령어입니다. 이를 통해 트랜잭션 내에서 작업의 중간 지점을 저장하고, 필요에 따라 그 지점으로 되돌아갈 수 있습니다.

### `SAVEPOINT`의 주요 사용 목적

1. **트랜잭션 내에서 부분 롤백 (부분 취소)**:
   - 트랜잭션이 진행되는 동안, 오류가 발생하거나 특정 조건이 만족되지 않을 경우 트랜잭션의 일부 작업만 취소하고, 이전에 설정된 저장점으로 롤백할 수 있습니다.
   - 이는 전체 트랜잭션을 취소하는 대신, 일부 작업만 취소하고 나머지는 그대로 유지하는 유연한 트랜잭션 관리를 가능하게 합니다.

### `SAVEPOINT` 구문
```sql
SAVEPOINT savepoint_name;
```

- `savepoint_name`: 설정하려는 저장점의 이름입니다. 이 이름을 사용하여 나중에 해당 시점으로 롤백할 수 있습니다.

### 예제

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. **오류 발생 또는 조건 불만족 시 저장점으로 롤백**:
   ```sql
   ROLLBACK TO SAVEPOINT sp1;
   ```
   - 이 명령어는 `sp1` 저장점 이후의 작업만 취소합니다. 즉, `account_id`가 `2`인 행의 삽입이 취소되고, `account_id`가 `1`인 행의 삽입은 유지됩니다.

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

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

### `SAVEPOINT` 관련 추가 명령어

- **`ROLLBACK TO SAVEPOINT savepoint_name`**:
  - 특정 저장점으로 롤백하여, 해당 저장점 이후의 모든 변경 사항을 취소합니다.
  
- **`RELEASE SAVEPOINT savepoint_name`**:
  - 특정 저장점을 해제하여, 더 이상 해당 저장점으로 롤백할 수 없도록 합니다.
  - 트랜잭션 내에서 특정 저장점 이후의 상태를 유지하고, 불필요한 저장점을 제거할 때 사용됩니다.
  - 일반적인 구문:
    ```sql
    RELEASE SAVEPOINT sp1;
    ```

### `SAVEPOINT`의 유용성
- **세분화된 오류 처리**: 트랜잭션 내에서 여러 단계로 작업을 나누고, 각 단계에서 오류가 발생할 경우 해당 단계만 되돌리고 나머지 작업은 유지할 수 있습니다.
- **복잡한 트랜잭션 관리**: 복잡한 트랜잭션을 관리할 때 특정 지점에서의 상태를 저장하고, 필요에 따라 그 지점으로 돌아가는 유연한 트랜잭션 처리가 가능합니다.

`SAVEPOINT`는 주로 데이터베이스의 무결성을 유지하면서도 복잡한 트랜잭션을 안전하고 유연하게 처리하는 데 사용됩니다.

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

별칭이 안되는 구문은?  (0) 2024.08.29
values ()  (0) 2024.08.29
rollback to savepoint  (0) 2024.08.29
update set  (0) 2024.08.29
GROUP BY 예시  (0) 2024.08.29