스프링/5. 스프링 DB-1 40

21. 이체 트랜잭션 적용

우선, 커밋모드에 대한 적용은 세션마다 이므로, 커넥션을 얻는 것은 한 섹션을 생성한 다음 그 섹션과의 소통을 위한 객체를 얻는 것이니 우리가 커넥션을 지정해서 줄 필요가 있다. @Slf4j public class MemberRepositoryV2 { private final DataSource dataSource; public Member findById(Connection con, String memberId) throws SQLException { String sql = "select * from member where member_id = ?"; PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = con.prepareStateme..

19. 조회할 때 락 가져오기

cud 뿐만 아니라 조회하는 순간에 락을 가져갈 수 있다. select 문 + for update 하면 된다. set autocommit false; select * from member where member_id='memberA' for update; 물론 이 순간에도 후에 commit이나 rollback 하면 락을 반납한다. 뭔가 내가 계산이 끝나기 전 까지 다른 세션에서 update 하지 못하도록 하고 싶을 때 쓴다고 한다. 내가 뭔가 복잡한 처리를 끝마칠 때 까지 다른 세션이 건들지 못하도록 하고 싶을 때.

18. DB 락

세션 1이 아직 commit을 안했는데 세션 2에서 (혹은 세션 1에서도) 같은 데이터를 접근 시 수정하면 뭔가 문제가 될 수도 있다. 그래서, 세션 1이 그 데이터들을 commit 혹은 rollback 하기 전 까지 lock 해 버린다. 아마 bool isAutoCommitMode = false; static ArrayList temps; 이런 식으로 각 세션마다 되어 있고, 실제 데이터 등록하는 그런 거는 cud(Data data) foreach( Data tempData : temps){ if(tempData.equals(data)){ throw new Error("data is Locked"); } } ~~~~ temps.add(data); if(isAutoCommitMode){ data.comm..

16. 자동커밋, 수동 커밋

DB에서 set autocommit true 하면 자동커밋(기본값) set autocommit false 하면 수동커밋 자동커밋은 쿼리 한 줄을 완료할 때마다 커밋 됨. 편리하지만, 우리가 원하는 commit, rollback의 트랜잭션 기능을 활용할 수는 없다. 예를 들면 5천원 계좌이체 일 때 update member set money = money + ? where member_id = ?; 첫번째 ?가 5천원, 두번째 ?가 A, update member set money = money - ? where member_id = ?; 첫번째 ?가 5천원, 두번째 ?가 B 이 두개가 완벽히 실행되어야 송금이 이루어 지는 것 이므로, 저거 두개가 완벽히 실행 된 이후에 commit을 하고 싶다는 거다. 커..

15. 트랜잭션 개념

사실 내부의 트랜잭션 동작은 DB마다 다 다르긴 함. 이것도 예시의 하나 이긴 함. DB 변경 쿼리를 실행하고, 그 결과를 DB에 저장하려면 commit, 저장하고 싶지 않다면 rollback commit 호출 전 까지 데이터는 임시로 저장하는 것임. 사실 우리가 그냥 쿼리만 날려도 DB에 저장이 되었는데, 그게 오토 커밋 모드라서 그럼. 수동 커밋 모드면 우리가 직접 commit도 해 줘야 함. 이런 느낌이다. 세션 1에서 테이블 조회하면 볼 수 있지만, 다른 세션에서 조회하면 볼 수 없다. 저렇게 세션 1에서만 임시로 보이고, 커밋을 해야 비로소 DB에 제대로 저장이 되는 것이다. 만약 커밋 되지 않은 상태로 트랜잭션 레벨을 설정해서 볼 수 있다고 가정했을 때, 세션 1이 저렇게 해놓은 상태에서, 세..

13. 트랜잭션

사실 데이터를 저장하려면 파일에 그냥 저장해도 된다. 근데 DB를 굳이 쓰는 이유는? DB는 트랜잭션이라는 개념을 지원하기 때문. 트랜잭션(Transaction)을 직역하면 거래라는 뜻인데, 트랜잭션은 하나의 안전한 거래를 보장해준다는 거다. 예를 들어 A와 B가 계좌이체를 한다고 했을 때, A의 잔고에서 5천원이 감소하고, B의 잔고에서 5천원이 증가하여야 한다. 근데 만약 A의 잔고에서 5천원이 감소한 상황에서, B의 잔고에서 5천원을 증가시키려고 했을 때 오류가 발생한다면? 그냥 A의 돈만 날리는 거다. 이러 한 점을 방지하기 위해, DB가 제공하는 트랜잭션 기능이란 저 둘이 하나라도 실패하면 거래 전의 상태로 돌아가 준다. 모든 작업을 성공해 DB에 정상 반영하는 것을 커밋(commit), 작업 ..