공유 전제
두 트랜잭션이 같은 두 행 A, B를 함께 수정해야 할 때, 차이를 만드는 것은 락의 개수가 아니라 락을 잡는 순서입니다.

행 단위 락은 범위를 줄여 주지만, 여러 행을 묶어 다루는 순간 순서가 엇갈리면 원형 대기가 생길 수 있습니다.

T1도 A와 B가 모두 필요 T2도 A와 B가 모두 필요
순서가 엇갈림 T1은 A → B, T2는 B → A로 접근
1
첫 락을 서로 다르게 잡습니다.

T1은 A를 선점하고, T2는 B를 선점합니다.

2
다음 락에서 서로를 막습니다.

T1은 B를 기다리고, T2는 A를 기다립니다.

3
대기가 원형으로 닫힙니다.

누구도 먼저 진행하지 못하므로 교착 상태가 됩니다.

T1: lock(A)  ... wait(B)
T2: lock(B)  ... wait(A)
결과: 데드락

서로 상대방의 락 해제를 기다리기 때문에 둘 다 멈출 수 있습니다.

순서를 고정 둘 다 A → B처럼 같은 기준으로 접근
1
경쟁 지점이 첫 락으로 모입니다.

둘 다 A부터 시도하므로 한쪽만 먼저 A를 잡습니다.

2
나머지 한쪽은 같은 지점에서만 기다립니다.

후행 트랜잭션은 A가 풀릴 때까지 대기하고, 원형 대기는 생기지 않습니다.

3
선행 작업이 끝난 뒤 같은 순서로 이어집니다.

직렬화는 되지만, 대기가 한 방향이라 결국 둘 다 완료됩니다.

T1: lock(A) -> lock(B) -> commit
T2: wait(A) -> lock(A) -> lock(B)
결과: 데드락 없이 순차 완료

여러 행을 함께 잠글 때는 같은 정렬 기준 하나를 팀 규칙으로 정해 두는 것이 안전합니다.

실무 규칙

예를 들어 여러 계좌를 잠글 때는 account_id 오름차순처럼 모두가 공유하는 접근 순서를 먼저 정하고, 그 순서를 모든 트랜잭션에서 그대로 지킵니다.