2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

REPEATABLE READ #158

Open NuhGnod opened 1 year ago

NuhGnod commented 1 year ago

p.180 맨 위 문단에서 READ COMMITED 격리 수준에서 금융의 예시를 들며 REPEATEABLE READ정합성 문제가 위험하다 라고 말했는데,

트랜잭션 B에서 총합을 반복 조회한다고 한다. 반복 조회하는 동안 트랜잭션 A에서 입금을 하면, 트랜잭션 B에 영향을 준다고 한다.

저는 이러한 상황이 문제가 된다고 하는것이 조금 이해가 안가는데요. 다른 트랜잭션에서 입금을 하면 당연히 트랜잭션 B에서 입금 총합을 조회할 때 변경되어도 상관없지 않나?? 라는 생각입니다.

이에 더해서 REPEATABLE READ 의 정의에 대해 왜 하나의 트랜잭션 안에서 select 쿼리는 같은 결과를 반환해야 하는지?

ssstopeun commented 1 year ago

제가 생각한 것은 입금뿐아니라 출금처리까지 생각해서

  1. B가 총합을 조회하니 10000원이었다.
  2. B가 조회한 총합의 범위 내에서 출금을 하고자 하였다.
  3. 그 사이 A가 출금을 해 총합의 변화가 생겼다. 이렇게 되는 상황을 생각해보았습니다. 총합의 조회까지는 문제가 안될 것 같은데 이 조회된 총합으로 어떤 행동을 할 때 문제가 생길 거라 생각했습니다.

이것과 이어져서 하나의 트랜잭션안에서 select쿼리가 같은 결과를 반환해야한다..는 거로 이해했습니다.

gmelon commented 1 year ago

저는 단순히 오늘 입금된 금액의 총합을 조회하는 작업을 시작하는 시점의 '오늘 입금된 금액의 총합'을 조회해낼 수 있어야 하기 때문에 문제가 된다고 생각했었습니다.

오늘 입금된 금액의 총합을 계산하는 트랜잭션이 시작된 시점 이후에 입금이 이뤄지더라도 해당 값들은 계산 금액에 포함되지 않아야 (실행하는 SQL문장이 어떤 결과를 가져오게 되는지를 정확히 예측할 수 있어야) 하기 때문이 아닐까 하고 생각했어요.

요구사항에 따라 달라지긴하겠지만 현 시점의 입금 총액을 알고 싶은데 한 트랜잭션을 실행하면서 날리는 여러 쿼리 중에 예를 들어 총액의 일부를 조회하는 A쿼리는 1시점에서의 입금 총액을 조회하고 총액의 또 다른 일부를 조회하는 B 쿼리는 2시점에서의 입금 총액을 조회한다면 의도한 바와는 다른 결과가 나오게 되는것 아닌가 하고 생각했습니다.