세션 db 커밋, 예전 정말 데이터베이스 자동 락 같은 구조와 commit 머 수동 transaction 연결 , DB 커밋 적용법
그래서 클라이언트는 사실베이스 서버에 결부을 신청하고 커넥션을 맺게 된다. 사실베이스 결부 건물와 사실베이스 세션아등가 사실베이스에 근접하기 위해서는 ‘커넥션’이 필요하다. 이때 사실베이스 서버는 내방에 세션 ( 사실베이스세션이라고도 함 )이라는 것을 만든다. 관계 글은 인프런 ‘용수철 사실베이스 1편 – 사실 근접 노른자위 규범 ‘ 를 고변 가다듬다 글입니다.
그리고 이강에 새로운 트랜잭션을 거듭 개시하다 수 있다. 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통석 트랜잭션을 기각한다. 고용자가 커넥션을 닫거나, 또는 사실베이스A(사실베이스 간수원)가 세션을 강제로 기각여름잠 세션은 기각된다. 그리고 앞으로 관계 커넥션을 각골통한 모든 신청은 이 세션을 통석서 거행하게 된다.
고로 관계 트랜잭션을 시작한 세션(고용자) 에게만 변경 사실가 웨이터고 다른 세션(고용자)에게는 변경 사실가 웨이터지 않는다. 예서 조심해야 할 것이 있는데 커밋을 구환하기 전까지는 부정기로 사실를 저막하는 것이다. 그림으로 보면 이렇다. 트랜잭션 고용법 ( commit 갈무리 )사실 변경 쿼리를 거행하고 사실베이스에 그 결말를 반영하려면 커밋 명령어인 commit 을 구환하고, 결말를 반영하고 싶지 않으면 롤백 명령어인 rollback 을 구환여름잠 된다.
극히 가당하다 대화이다. 그러면 세션1이 사실베이스를 볼 때는 자신이 넣은 값이 웨이터지만 세션 2가 사실베이스를 볼 때는 세션1이 넣은 값이 웨이터지 않는다. 왜냐면 세션1이 미처 commit을 안했으니까. 세션 1과 세션 2는 같은 사실베이스를 고변 있는 공기인데 세션 1이insert문으로 사실베이스에 값을 넣긴 했지만 미처 commit은 안한 공기이다.
자동 커밋, 소극 커밋자동 커밋으로 설정여름잠 각개의 쿼리 거행 즉후에 자동으로 커밋을 구환한다. 그럼 세션 1이 사실를 추가하고 , 커밋을 여름잠 어떻게 될까?그제서야 세션2도 세션1이 가미하다 사실를 볼 수 있게 된다. 고로 커밋이나 롤백을 직접 구환하지 않아도 되는 편리함이 있다. 그래서 아까 위에서도 말했듯이 커밋을 구환하기 전까지는 부정기로 사실를 갈무리한다고 관심여름잠 된다.
그럼 어떻게 함? 곧 소극 커밋으로 바꾸면 된다. 왜냐면 자동 커밋으로 설정을 해버리면무대장치 autocommit true; //자동 커밋 모드 설정insert into member(member_자아, money) values (‘사실1’,10000); //자동 커밋1) insert into member(member_자아, money) values (‘사실2’,10000); //자동 커밋2)쿼리문 한줄 한줄이 곧 commit이 되어버리기 땜에 제 공작을 단독 뭉쳐야하다 트랜잭션의 개성상 자동 커밋 성능은 트랜잭션을 고스란히 수행하지 못하게 한다. 이런식으로 부호를 짜면 된다. 하지만 쿼리를 하나하나 거행할 때 마다 자동으로 커밋이 되어버리기 땜에 아등가 원하는 트랜잭션 성능을 고스란히 고용할 수 없다.
사실베이스락만약 모 세션이 트랜잭션을 시작하고 사실를 수정하는 간격 미처 커밋을 하지 않았는데 , 다른 세션에서 동시에 같은 사실를 수정하게 되면 분명히 제가지 문제가 발생할 것이고 실제로 발생한다. 소극 커밋 설정을 여름잠 이강에 꼭 commit , rollback 을 구환해야 한다. 그래서 이런 문제를 방지하려면, 세션이 트랜잭션을 시작하고 사실를 수정하는 간격에는 커밋이나 롤백 전까지 다른 세션에서 관계 사실를 수정할 수 없게 막아야 한다. 무대장치 autocommit false; //소극 커밋 모드 설정insert into member(member_자아, money) values (‘사실3’,10000);insert into member(member_자아, money) values (‘사실4’,10000);commit; //소극 커밋심상성 자동 커밋 모드가 근본으로 설정된 과우가 많기 땜에, 소극 커밋 모드로 설정하는 것을 트랜잭션을 시작한다고 표현할 수 있다.
‘세션 1’과 ‘세션 2’ 가 같은 사실베이스를 고변 있고 ‘세션 1’ 이 사실베이스에 있는 값을 변경하려고 여름잠 세션1은 트랜잭션을 시작하고 , 관계 로우에 락을 낙수한다. 심상성 이런 시나리오로 ‘사실베이스락’ 이 쓰여지고 간수된다. 근데 문제는 ‘세션 2’ 도 세션1과 같은 로우의 값을 변경하고 싶은거임. 그걸 가능하게 해주는 것이 ‘사실베이스락’이다.
락 대기 겨를을 넘어가면 락 타임아웃아웃 오류가 발생하고, 락 대기 겨를은 설정할 수 있음. ( * 감안로 세션2가 락을 무기한 기다리다 것은 아님. ) 그래서 ‘세션 2’는 lock을 낙수하기 위해 대기함. 근데 딱 보니까 관계 로우의 사실베이스락이 없네? 그럼 어떡함?,뭐 어떡하긴 세션1이 미리 왔으니까 기다려야지.
그럼 그제서야세션 2가 세션1이 반납한 락을 가져가고, 트랜잭션을 시작한나중값을 변경하고 commit침. 그러면 위 그림처럼 락을 반납해야함. 다 끝나면 락을 반납함. 자 오랜겨를이 지나고, 세션1이 관계 로우값의 변경을 끝냈음.
그러다 보니 애플리케이션에서 사실베이스 트랜잭션을 도입하려면 서비스 계급이 굉장히 지저분해지고, 관심보다 굉장히 까다롭다 부호를 요구한다. 과연 머 같은 과거 transaction 도입법과거에는 transaction을 도입하려고 여름잠 과연 많은 부호들이 필요했다. 추가로 커넥션을 유지하도록 부호를 변경하는 것도 쉬운 일은 아니다. 심상성 사실베이스락이라는게 이런 시나리오로 쓰이고, 사실베이스락이라는 것이 존재하기 땜에 트랜잭션이 좀 더 안전하게 몸가짐할 수 있는 거.
나중에는 이 문제를 해결할 기법을 소개한다.