ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DB 트랜잭션 - 자동 커밋, 수동 커밋 / DB 락
    스프링/스프링 기초DB 2023. 3. 14. 18:36

    db에 데이터를 저장할 때 커밋이라는 용어가 있다. 데이터를 변경하고 나서 커밋을 해주면 db에 최종 저장이 되어서 다른 사용자가 볼 때에도 저장된 데이터를 볼 수 있다.

     

    맨 위의 set autocommit true;는 자동 커밋으로 변경한다는 뜻인데, default 값이 자동 커밋이기 때문에 사실 생략해도 된다. 위 처럼 자동 커밋을 실행하면 oldId라는 데이터가 db에 저장되어서 다른 세션에서 접근해도 확인할 수 있다.

     

    다음은 수동 커밋 모드이다. 수동 커밋 모드에서는 임시 저장을 하기 때문에 이것을 행한 세션에서는 보이지만 다른 세션에서는 member를 호출해도 볼 수 없다.

    수동 커밋 한 세션
    다른 세션에서는 보이지 않음

     

    이러한 이유는 데이터를 저장할 때 여러 작업을 하나의 묶음으로 생각하기 위해서이다. 만약에 A가 B에게 계좌이체 5000원을 했는데 A의 계좌에서 5000원이 차감된 작업은 성공했지만 B의 계좌에서 5000원이 증가한 작업이 실패한다면 아예 둘 다 실패하고 오류 메시지를 출력하는 것이 훨씬 낫다.

     

     

    set autocommit false;
    update member set money=10000 - 2000 where member_id = 'memberA';
    update member set money=10000 + 2000 where member_iddd = 'memberB'; // 에러

    에러를 발생해서 아래가 실행이 안된다면 A의 계좌는 8000원, B의 계좌는 10000원일 것이다.

     

    그래서 우리는 수동 커밋 모드에서 2가지 선택을 할 수 있는데, commit;을 통해서 커밋을 해주거나 rollback;을 통해서 rollback을 해줘야한다.

     

     

     

     

    DB락

    DB락이란 여러 개의 세션이 동시에 데이터를 수정할 때에 우선권을 주는 것이다. 세션1과 세션2라는 사람이 동시에 A라는 데이터를 수정한다고 치자. 자동 커밋이 아니라 자신의 세션에서만 임시로 저장해주는 수동 커밋이라면 둘 중 한 사람이 수정한 데이터는 날라갈 것이다. 그렇기 때문에 DB락이라는 우선권을 준다.

    첫 번째 세션에서 수동 커밋으로 수정을 한 뒤에 commit을 누르지 않은 상태이고, 위 사진은 세션2이다. 첫 번째 줄은 SET LOCK_TIMEOUT 60000;인데 이 뜻은 락이 60초 안에 오지 않으면 오류가 발생한다는 뜻이다. 즉, 세션1 사용자가 60초안에 commit이나 rollback을 해줘야지만 세션2가 락을 가지게 되고 이후에 수동 커밋한 것처럼 자신의 세션에만 money가 1000으로 바뀌게 되며 이후에 commit과 rollback으로 db에 변경할 수 있다.

    '스프링 > 스프링 기초DB' 카테고리의 다른 글

    데이터 접근 기술 - JPA  (0) 2023.03.26
    db 테스트에서의 트랜잭션  (0) 2023.03.25
    스프링 예외 추상화  (0) 2023.03.19
    체크 예외, 언체크(런타임) 예외  (0) 2023.03.19
    DB - 커넥션풀과 DataSource  (0) 2023.03.14
Designed by Tistory.