Database/SQL

SQL - 트랜잭션 범위 개선

JaeHoney 2022. 2. 13. 20:27

트랜잭션

트랜잭션은 최소의 단위로 설정하는 것이 중요합니다. 아래 예제는 사용자가 게시판에 게시물을 작성한 후 저장 버튼을 클릭했을 때 서버의 동작을 순서대로 정리한 것입니다.

1) 처리 시작
  => 데이터베이스 커넥션 생성
  => 트랜잭션 시작
2) 사용자의 로그인 여부 확인
3) 사용자의 글쓰기 내용의 오류 여부 확인
4) 첨부로 업로드된 파일의 확인 및 저장
5) 사용자의 입력 내용을 DBMS에 저장
6) 첨부 파일 정보를 DBMS에 저장
7) 저장된 내용 또는 기타 정보를 DBMS에서 조회
8) 게시물 등록에 대한 알림 메일 전송
9) 알림 메일 발송 이력을 DBMS에 저장
  => 트랜잭션 종료(COMMIT)
  => 데이터베이스 커넥션 반납
10) 처리 완료

 

개선 사항

 

1. 트랜잭션이 처리 시작과 동시에 시작되지만, 2번, 3번, 4번은 간단한 조회 등이기 때문에 트랜잭션에 포함시킬 필요 없음 -> 자원 낭비

 

2. 8번 작업이 트랜젝션 내부에 들어있음 -> 메일 서버와 통신할 수 없게 되면, 웹 서버와 DB 서버의 장애를 초래함 (큰 단위의 서버들이 메일 서버에 종속적이게 됨)

 

3. 7번 작업은 단순 조회이므로 트랜젝션에 포함시킬 이유 없음, 9번은 5,6 번과 성격이 다르므로 트랜잭션을 분리해야 함..

 

개선 결과

1) 처리 시작
2) 사용자의 로그인 여부 확인
3) 사용자의 글쓰기 내용의 오류 발생 여부 확인
4) 첨부로 업로드된 파일 확인 및 저장
  => 데이터베이스 커넥션 생성(또는 커넥션 풀에서 가져오기)
  => 트랜잭션 시작
5) 사용자의 입력 내용을 DBMS에 저장
6) 첨부 파일 정보를 DBMS에 저장
  => 트랜잭션 종료 (COMMIT)
7) 저장된 내용 또는 기타 정보를 DBMS에서 조회
8) 게시물 등록에 대한 알림 메일 발송
  => 트랜잭션 시작
9) 알림 메일 발송 이력을 DBMS에 저장
  => 트랜잭션 종료 (COMMIT)
  => 데이터베이스 커넥션 종료(또는 커넥션 풀에 반납)
10) 처리 완료

 

감사합니다!