트랜잭션 A가 데이터(Following)를 insert하면서 FK가 걸려있는 레코드(User)에 S-Lock 설정
트랜잭션 B가 데이터(Following)를 insert하면서 FK가 걸려있는 레코드(User)에 S-Lock 설정
트랜잭션 A가 User의 follower_count를 변경하면서 X-Lock 설정을 위해 대기
하지만, B가 해당 레코드에 대한 S-Lock이 설정되어 있으므로 서로 호환되지 않기 때문에 S-Lock이 풀릴때까지 대기
트랜잭션 B가 User의 follower_count를 변경하면서 X-Lock 설정을 위해 대기
하지만, A가 해당 레코드에 대한 S-Lock이 설정되어 있으므로 서로 호환되지 않기 때문에 S-Lock이 풀릴때까지 대기
이로 인해 서로 다른 트랜잭션이 같은 자원에 대해 Lock을 가지고 있으며, 서로 Lock을 해제할 때까지 대기하면서 데드락이 발생합니다.
FollowingCommandPort.findByUserIdAndTargetUserId()UserCommandPort.findById()