- 예시1) 은행 계좌 간에 이체를 할 때, 금액을 한 계좌에서 빼고 다른 계좌에 더하는 두 가지 연산은 한 작업의 단위로 처리되어야 하는 트랜잭션
- 예시2) 주문을 하고 order테이블에 주문을 생성하고, item테이블에서 재고까지 빼주는 작업이 한 단위로 처리되어야 하는 트랜잭션
sql툴에서 auto_commit 모드 해제
예시)
INSERT INTO board_test.author(id, name, email) VALUES(2, 'test', 'test@naver,com');
INSERT INTO board_test.post(title, contents, author_id) VALUES('hello', 'hello is', 10);
예시)
INSERT INTO board_test.author(id, name, email) VALUES(1, 'test', 'test@naver,com');
COMMIT;
INSERT INTO board_test.author(id, name, email) VALUES(2, 'test2', 'test2@naver,com');
INTSERT INTO board_test.post(title, contents, author_id) VALUES('hello', 'hello is', 10);
mariaDB의 기본 설정은 Repeatable Read0
한 트랜잭션에서 동일한 조회 쿼리를 두 번 이상 실행할때에, 그 중간에 다른 트랜잭션에서 데이터를 수정하여 한 트랜잭션의 결과가 다르게 나타나는 문제
예시)
재고 업데이트 전 현재 재고 조회
→ 수량업데이트
→ 변경된 재고 수량을 다시 조회(한트랜잭션에서).
그러나 만일 이를 중간에 누가 수정을 가하면 재조회 시 오차 발생하여 에러.
해결책
Repeatable Read 격리성
한 트랜잭션이 같은 조회쿼리를 여러 번 실행했을 때, 그 중간에 다른 트랜잭션에서 새로운 데이터를 추가/삭제하여 다르게 나타나는 문제
해결책
Repeatable Read 격리성
사실 동시성 문제는 read만이 문제는 아니고, read이후 DB에 어떠한 수정사항을 가할때도 read의 오차로 인한 또다른 오차가 발생하여 DB 전체에 영향이 발생하므로 DB 전체에 대한 동시성이라 보면 될것.
ex) 상품주문의 최종 수량이 1개
→ transaction에 read && update가 있을때
→ 내 tran에서 1 read
→ 타 트랜잭션이 1 read
→ 내 tran에서 0으로 update
→ 타 tran에서 0으로 update
→ 최종 수량에 오류 발생
pessimistic lock
- 공유락
- lock - PESSIMISTIC_READ
- 배타락
- lock - PESSIMISTIC_WRITE
- 특정행에 대해 lock을 걸어 read조차 막음으로서 update시에 발생하는 이슈 원천 차단.
- Serializable수준의 격리를 특정테이블과 특정데이터에 적용가능
구분 | Optimistic Lock | Pessimistic Lock |
---|---|---|
정의 | 충돌이 없을 것으로 가정하여 락을 걸지 않음 | 충돌을 예상하고 미리 락을 검 |
사용법 | 버전을 사용해 관리 | 모드 설정 및 쿼리에 직접 사용, DB단에서 설정 가능 |
별칭 | 낙관적인 락 | 비관적인 락 |
장점 | 데드락 가능성이 적으며 성능의 이점 | 충돌에 대한 오버헤드가 줄어들며 무결성을 지키기 용이 |
단점 | 충돌이 발생하면 오버헤드 발생 | 충돌이 없으면 오버헤드가 발생 |