데이터 변경 쿼리를 실행하고 DB에 그 결과를 반영하려면 commit 을 호출하고 결과를 반영하고 싶지 않으면 rollback 을 호출하면 된다.
-> 어? 나는 DB에 INSERT 쿼리 날리면 바로 반영 되던데요?
-> 보통 AutoCommit 이 켜져있다.
세션 1에서 데이터 추가하고 아직 commit 하지 않은 상태라고 하자.
-> 세션2 에서는 SELECT해도 신규회원이 안보인다.
-> 세션1 에서는 SELECT해도 신규회원이 보인다.
commit하지 않은 데이터가 다른 세션에서 조회가능하면 어떤 문제가 발생할까?
세션1 - 데이터 추가 (아직 commit 전)
세션2 - 데이터 조회 (commit안한 데이터가 조회됐다고 가정)
세션1 - 추가 했던 데이터 삭제
-> 데이터 정합성 문제
따라서 commit 전 데이터는 다른 세션에서 보이지 않는다.
(하지만 앞서 배운 트랜잭션 격리 수준을 READ UNCOMMITTED 로 설정하면 조회 되긴 한다.
보통 DB 의 트랜잭션 격리 수준은 READ COMMITTED가 기본값으로 설정 되어있다.)
만약 신규데이터 추가 후 commit 대신 rollback을 하면 모두 트랜잭션 시작 직전 상태로 복구된다.
---------------------------------
3-5. 트랜잭션 - DB 예제2 - 자동 커밋, 수동 커밋
set autocommit true; //자동 커밋 모드 설정
insert into member(member_id, money) values ('data1',10000); //자동커밋
insert into member(member_id, money) values ('data2',10000); //자동 커밋
( 오토커밋이므로 commit; 해줄 필요 없다. )
오토 커밋 모드는 내부적으로 한 줄씩 트랜잭션 열었다 닫았다 반복한다.
하지만 수동커밋을 내가 트랜잭션 범위를 변경 할 수 있다.
commit 이나 rollback 반드시 호출!
-> 둘 다 안하면 DB의 기본 타임아웃 시간 넘어가면 자동으로 rollback됨.
트랜잭션을 시작한다 = 수동 커밋모드로 바꾼다
# 본 게시글은 인프런 김영한님의 강의를 수강 후 반복학습을 위해 정리한 내용입니다.
꾸준히 다시보자.
1. 221014
2. 221101
'Java, Spring > Spring DB 1' 카테고리의 다른 글
3-8. DB 락 - 조회 (1) | 2022.09.23 |
---|---|
3-7. DB 락 - 개념 이해, 3-8. DB 락 - 변경 (1) | 2022.09.23 |
3-1. 트랜잭션 - 개념 이해, 3-2. 데이터베이스 연결 구조와 DB 세션 (1) | 2022.09.23 |
2-5. DataSource 적용 (0) | 2022.09.22 |
2-4. DataSource 예제2 - 커넥션 풀 (0) | 2022.09.22 |