송금 기능 만들고 있는데요, 부하 테스트만 돌리면 심심하면 이 에러가 뜹니다.


ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction


코드 보면 A계좌에서 B계좌로 돈 보낼 때 이렇게 두 행을 업데이트해요.


-- 세션1: 1번 -> 2번으로 송금
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;


동시에 반대 방향 송금도 일어나요.


-- 세션2: 2번 -> 1번으로 송금
UPDATE accounts SET balance = balance - 100 WHERE id = 2;
UPDATE accounts SET balance = balance + 100 WHERE id = 1;


혼자 돌릴 땐 멀쩡한데 동시에 여러 건 들어오면 터져요. 두 트랜잭션이 서로를 기다리다가 죽는 것 같긴 한데, 이걸 근본적으로 어떻게 막는지 감이 안 옵니다. 그냥 재시도만 걸어두면 되는 건가요 아니면 설계를 바꿔야 하나요?