의문점 공부하기/🧾공부하며

🧾 Auto commit을 false로 설정해야 하는 이유는????

아리빠 2023. 7. 26. 11:49

데이터 변경(입력/수정/삭제) 작업을 수행 할 때 여러개의 테이블 사용하는데, 많은 항목을 다뤄야 하기 때문에 데이터가 중복되지 않도록 여러 테이블에 분산 저장한다

 

Ex)

게시글 저장(실제 여러 입력작업으로 되어있음)

게시글 ----insert----> 게시글 테이블

   +

여러개의 첨부파일 ----insert----> 첨부파일 테이블 <= 첨부파일을 저장하다가 실패를 하게되면 게시글 입력도 취소 해야함 

 

-왜 why?: 만약 이력서에 첨부파일 3개를 첨부해서 업로드 했는데 1개만 올라가고 에러 발생!, 여기까지만 OK 해버리면 나머지 2개는 안올라간 채로 업로드 완료 상태가 되어버림, 따라서 한개라도 실패하면 전체 실패로 간주하고 다시 올리게 해야함

- 게시글 저장을 수행 할 때 실행되는 모든 데이터 변경 작업은 한단위(atomic =transcatoin)로 다뤄야 한다 

 

Transation:한단위로 묶어서 다루는 작업들

=> 모든 데이터 변경 작업이 성공시 테이블에 적용 :commit

=> 단 한개의 작업이라도 실패시 그 전까지 수행한 작업을 모두 취소 :rollback

 

▶Auto commit이false인 상태에선 데이터 변경 작업이 커넥션 별로 임시 DB에 보관된다

 


Auto commit이 "true"로 설정되면 각 SQL 쿼리가 개별적인 트랜잭션으로 처리되어 쿼리가 성공적으로 실행될 때마다 자동으로 커밋(저장)되게 된다.

그러나 Auto commit을 "false"로 설정하면 모든 쿼리들은 하나의 트랜잭션으로 묶이고, 명시적인 커밋을 호출하기 전까지는 변경 사항이 실제로 데이터베이스에 적용되지 않는다

Auto commit을 "false"로 설정하는 이유:

롤백 가능성: Auto commit이 "false"로 설정되면 여러 개의 쿼리가 하나의 트랜잭션으로 묶이기 때문에 중간에 오류가 발생하거나 트랜잭션을 롤백해야 할 경우, 트랜잭션 전체를 롤백할 수 있다. 데이터의 일관성과 안전성을 보장

원자성 유지: 트랜잭션 내의 모든 쿼리는 원자적(atomic)으로 실행되어야 한다. 원자성은 트랜잭션이 부분적으로만 적용되지 않고, 전체가 적용되거나 전혀 적용되지 않음을 의미, Auto commit이 "false"로 설정되면 모든 쿼리를 트랜잭션으로 묶어 원자성을 유지할 수 있다.