고객A
고객B가 있다면
송금메소드를 하나만들고 그것을 경합이 발생하지않도록 동기화해주는 기능을 추가해놓고
고객A와 B, 송금할금액을 매개변수로 받아서
A와 B의 컬렌트 보유금액을 가져와서
A에서 B로 보낼때 계산을 내부적으로 임의의 변수로해주는거임
그다음 A와 B에 넣기전에, commit이라는 메소드를 내부에서 또 호출함
commit내부에서는 실제로 고객A와 B의 금액을 송금메소드로 계산한 금액으로 갈아 넣는데,
분기처리로 if else가 있어야함
if에는
위에서 계산된 결과와 현 시점에서 실제 유저의 current의 보유금액을 이용한 계산결과가 일치하는지 확인하고
대체한다.(이렇게 하는 이유는 간단한데, 위에서 계산된 값이 실제로 유저에 직접 입력하기보다는 이렇게 검증을 하고, 현시점에도 변동이없다면 바꾼다는 방식임)
else에는
현시점의 유저에 다른 쓰레드에서 결과적으로 변동이 발생한것이지
그럼 간단한게, 여기서 다시 current값을 읽어들여서 계산해서 리턴해주면됨
핵심은 송금처리에 입금 출금을 하나로 만드는거임
따로 나누는순간 경합이 일어나든가 데드락이 발생할 가능성이 농후하고
설령 어떠한 이유로 변동이 발생했을경우의 대비를위한 검증처리를 commit이라는 메소드를 내부에서 호출해서
실제 인스턴스의 무결성을 보장한다는 방식이다.
트랜잭션 쓰면 알아서 해주는데 왜 삽질할라하노 이기?
이게 트랜잭션 기능을 메소드처럼 만든거임
입력값에서도 충분히 해볼만한 시도라고보는데, 그러니까 니가 땔감이라고본다. db내부에서 트랜잭션으로 무결성이 보장되더라도 그게 실행되기전에 검증을 해야지