📌 DB 동시성 이슈
트랜잭션이 동시에 실행됐을때 발생할 수 있는 문제 관련한 상황
= Read Phenomena (읽기 이상현상)
💡 dirty read
- 동시에 진행되고 있는 다른 트랜잭션(아직 커밋하지 않은 상태)에서 변경한 데이터를 현재 진행 중인 트랜잭션에서 읽어 들이는 것을 뜻합니다.
- 아직 commit되지 않은 데이터가 읽힘으로서, 추후 rollback 될 가능성이 있는 데이터 read
- 해결책 : Read Committed 격리성
💡 Non-Repeatable Read
- 하나의 트랜잭션 중 읽어 들였던 특정 row의 값을 같은 트랜잭션 내에서 다시 읽어 들이는데 중간에 변경사항이 생겨 (실제로 COMMIT이 된 변경사항) 결괏값이 다르게 나오는 현상을 뜻합니다.
- mariaDB의 기본 설정은 Repeatable Read
- 한 트랜잭션에서 동일한 조회 쿼리를 두 번 이상 실행할때에, 그 중간에 다른 트랜잭션에서 데이터를 수정하여 한 트랜잭션의 결과가 다르게 나타나는 문제 예시) 재고 업데이트 전 현재 재고 조회 -> 수량업데이트 -> 변경된 재고 수량을 다시 조회(한트랜잭션에서). 그러나 만일 이를 중간에 누가 수정을 가하면 재조회시 오차 발생하여 에러.
- 해결책 : Repeatable Read 격리성 -> 한 트랜잭션이 조회하는 동안 다른 트랜잭션이 update를 하더라도 현재 트랜잭션의 read값이 변경되지 않도록 하는 격리성. 그러나, 만약 다른 트랜잭션에서 update를 통해 값을 변경해버렸다면, read한 값 자체에 문제 발생. => 비관적인 Lock(공유락, 배타락) 사용
💡 Phantom Read
- 트랜잭션 시작 시점 데이터를 읽었을 때 존재하지 않았던 데이터가 다시 같은 조건으로 데이터를 읽어 들였을 때 존재해 (유령처럼) INCONSISTENT 한 결괏값을 반환하는 현상을 뜻합니다.
- 한 트랜잭션이 같은 조회쿼리를 여러 번 실행했을 때, 그 중간에 다른 트랜잭션에서 새로운 데이터를 추가/삭제하여 다르게 나타나는 문제
- 해결책 : Repeatable Read 격리성. 팬텀(유령) 읽기 또한 repeatable Read격리성으로 해결이 가능하나, 이 부분은 DB마다 차이가 있어 phantom read를 해결하기 위해 Serializable 격리수준이 필요할수도 있음. 다만, DB에서 주로 발생하는 문제는 동시에 수정하는 상황이므로, 수정에 초점을 두고 해결 전략을 살펴봐도 좋을것.
💡 Lost Updates
- 한 트랜잭션에서 데이터를 변경한 뒤 아직 커밋을 하지 않은 상태에서 읽어 들일 때, 다른 트랜잭션으로 인해 내가 작성한 변경사항이 덮어씌워지는 현상을 뜻합니다.
📌 DB 동시성 이슈로 인한 읽기 이상현상 해결 방법
https://rookie-programmer.tistory.com/149
- Reference
https://amazelimi.tistory.com/entry/MySQL-Transaction%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83
'Back-End 공부 > Database' 카테고리의 다른 글
[Database] DB Dump로 백업, 복구하기 (0) | 2023.11.22 |
---|---|
[Database] 사용자 관리, 사용자 권한부여(GRANT, REVOKE) (0) | 2023.11.22 |
[Database] 트랜잭션 격리 수준(isolation level) 문제점과 해결방법 (0) | 2023.11.22 |
[Database] GROUP BY절, HAVING절 (1) | 2023.11.22 |
[Database] INDEX와 VIEW 생성, 조회, 삭제 방법, 사용자 관리 방법 (0) | 2023.11.22 |