반응형
💋 인트로
MySQL의 동시성에 영향을 주는 요소
- 락(Lock)
- 트랜잭션
- 트랜잭션의 격리 수준(Isolation Level)
✔ 트랜잭션
- 작업의 완전성을 보장해주는 것
- 논리적인 작업 셋을 모두 완벽하게 처리하거나, 처리하지 못할 경우에는 원상복구해서 작업의 일부만 적용되는 현상(Partial update)이 발생하지 않게 만들어주는 기능
✔ 락
- 여러 커넥션에서 동시에 동일한 자원을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 것
- 만일 하나의 레코드를 여러 커넥션에서 동시에 변경하려고 하는데, 락이 없다면 하나의 데이터를 여러 커넥션에서 동시 변경할 수 있게 되어, 레코드 값은 예측할 수 없는 상태가 됨
✔ 락 VS 트랜잭션
- 락: 동시성 제어를 위한 기능
- 트랜잭션: 데이터 정합성을 보장하기 위한 기능
💋 트랜잭션
✔ 개념
- MySQL에서 기본 스토리지 엔진으로 사용하는 InnoDB에서 제공하는 기능
- 부분 업데이트 현상이 발생하지 않도록 해서 애플리케이션 개발에서 고민해야 할 문제를 줄여주는 필수적인 DBMS의 기능
- 트랜잭션을 지원하지 않는 스토리지 엔진에 대한 참고 (접은글)
더보기
- 스토리지 엔진에 따라서 트랜잭션을 지원하기도, 지원하지 않기도 함.
- 트랜잭션을 지원하지 않는 스토리지 엔진(eg. MyISAM)의 경우, 부분 업데이트 현상이 발생하면 실패한 쿼리로 인해 남은 레코드를 다시 삭제하는 재처리 작업이 필요할 수 있음.
✔ 주의사항
- 꼭 필요한 최소의 코드에만 적용해서 애플리케이션 코드 내 트랜잭션의 범위를 최소화
- 데이터베이스 커넥션 수는 개수가 제한적이어서, 각 단위 애플리케이션이 커넥션을 소유하는 시간이 길어질수록 사용 가능한 커넥션 수가 줄어들기 때문
- 예) DBMS에 데이터를 저장하기에 앞서 검증을 해야 한다면, 비즈니스 로직은 검증부터 시작되지만, 트랜잭션은 실제로 DBMS에 데이터를 저장하는 작업부터 시작하는 것이 좋음.
- 예) 메일 전송, 파일 전송 작업 또는 네트워크를 통해서 원격 서버와 통신하는 작업은 DBMS 트랜잭션 내에서 제거하는 것이 좋음. 통신이 안되는 상황이 발생하면, 웹 서버 뿐 아니라 데이터베이스 서버까지 위험해지는 상황이 발생할 수 있음.
💋 참고자료
- Reql MySQL 8.0 1편
- https://dev.mysql.com/doc/refman/8.0/en/innodb-introduction.html
- MyISAM과 InnoDB 비교
반응형
'MySQL' 카테고리의 다른 글
[MySQL] MVCC와 언두 로그(Undo log) (0) | 2023.08.29 |
---|---|
[MySQL] MySQL 엔진의 락 (Lock) (0) | 2023.08.15 |
[MySQL] MySQL 아키텍처: 접속 클라이언트, MySQL 엔진, 스토리지 엔진, 운영 체제, 하드웨어 (0) | 2023.08.14 |
[MySQL] ON DELETE CASCADE: foreign key로 묶인 테이블의 레코드를 삭제할 때, 해당 레코드를 참조하는 다른 테이블의 레코드도 함께 자동으로 삭제하기 (0) | 2023.05.08 |
[MySQL] No value supplied for the SQL parameter 'gameId': No value registered for key 'gameId’ 오류 해결 (0) | 2023.04.28 |