- 코딩 공부/Spring

트랜젝션 이해

방개입니다 2022. 10. 11. 03:30

트랜젹선의 개념

  • 트랜잭션을 하나로 묶을 수 있는것. 하나로 커밋하고 하나로 롤백한다.
  • 하나의 거래를 안전하게 처리해주는 것 

트랜젝션은 ACID 

  • 원자성: 작업들이 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야한다. 
  • 일관성: 무결성 제약조건을 항상 만족 
  • 격리성: 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 
  • 지속성: 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 

 

데이터베이스 구조 

  • 사용자는 웹 어플리케이션(WAS)나 DB접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할 수 있다. 클라이언트는 데이터베이스 서버에 연결을 요청하고 커넥션을 맺게 된다. 이때, 데이터베이스 서버는 내부에 세션이라는 것을 만든다. 그리고 앞으로 해당 커넥션을 통한 모든 요청은 이 세션을 통해서 실행하게 된다. 
  • 커넥션에 연결된 커넥션에 연결된 세션이 SQL을 실행한다. 
  • 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을 다시 시작할 수 있다. 
  • 사용자가 커넥션을 닫거나, 또는 DBA(DB관리자)가 세션을 강제로 종료하면 세션은 종료된다.

 

트랜잭션 사용법 

  • 데이터변경 쿼리를 실행하고 데이터베이스에 그 결과를 반영하려면 커멧 명령어인 commit을 호출하고, 결과를 반영하고 싶지 앟으면 롤백 명령어인 rollback을 호출하면 된다. 
  • 커밋을 호출하기 전까지는 임시로 데이터를 저장하는 것이다. 따라서 해당 트랜잭션을 시작한 세션(사용자)에게만 변경 데이터가 보이고 다른 세션(사용자)에게 변경 데이터가 보이지 않는다. 

 

수동 커밋 모드로 설정하는 것을 트랜잭션을 시작한다고 표현할 수 있다. 

수동커밋으로 하면은 커밋이다 롤백은 반드시 실행해야한다. 

데이터베이스에 타임아웃이 있는데 설정 한 시간을 넘어가게 되면은 자동으로 롤백이 된다. 

 

디비락 - 개념이해 

세션1에서 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것. 여기에 더해서 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다. 

 

해결방법: 세션1에서 수정하고 있는 데이터를 세션2에서 수정하지 못하게 막아버린다. 

 

락이란: 세션1이 트랜잭션을 시작하게 되면 락을 가지게 된다. 세션1이 커밋을 다 마치면 락이 세션2로 가게된다. 

락에는 타임아웃이 있는데 시간이 지나게 되면은 자동으로 락을 기다리고있는 세션으로 락이 이동하게 된다. 

 

비즈니스 로직관 트랜잭션 

트랜잭션을 사용하는 동안 같은 커넥션을 유지해야한다. -> 그래야 같은 세션을 사용할 수 있다. 

 

V1에서는 커넥션을 유지를 안해주어서 하나의 계좌만 돈이 빠져 나가는 이슈가 있는데 이 문제가 금융권에서 실제고 발생하게 된다면은 큰 문제가 야기된다. 그러므로 두 계좌 전부다 업데이트 처리를 해주어야한다. 

 

 

 

 

문제 => 트랜젝션 처리하는 구문들이 더 많은 문제가 있다. (다음 시간에..)