Loading

행을 잠글 수 없음 - 레코드 현재 사용 불가능 오류

게시 일자: Mar 18, 2026
상세 설명

레코드를 업데이트하거나 만드는 경우, 해당 레코드에 잠금을 적용하여 다른 작업에서 레코드를 동시에 업데이트하여 데이터 불일치가 발생하는 문제를 방지합니다.

이 잠금은 대개 몇 초 동안 지속되고, 잠금이 해제되면 다른 작업에서 해당 레코드를 필요한 대로 처리할 수 있습니다. 하지만 특정 트랜잭션은 최대 10초 동안만 잠금 해제를 기다릴 수 있고, 그 후에는 시간 초과됩니다.

솔루션

언제 어떤 레코드가 잠기느냐는 수행 중인 작업과 작업 중인 주 레코드에 따라 결정됩니다. Force.com Record Locking Cheatsheet에서 이에 관한 자세한 정보를 확인할 수 있으며, 해당 내용을 숙지할 것을 적극 권장합니다.

레코드 잠금 해제를 방지하는 일반적인 시나리오

 

a. Email-To-Case

이메일이 email-to-case로 처리되는 경우, 이메일 메시지 개체 또는 관련 개체(상위 계정 등)의 트리거가 해당 레코드를 처리하기 위해 잠금을 시도합니다. 다른 프로세스에서 해당 레코드의 잠금을 유지하고 있고 이메일 처리를 위해 10초 넘게 기다려야 하는 경우 시간 초과가 발생하고 이 오류가 표시됩니다.
 

b. Apex 트리거/API

과업(Task) 오브젝트에 대한 After Insert Apex 트리거가 있고, 처리를 위해 약 14초 동안 실행된다고 가정해 보십시오. 이 트리거는 과업이 생성될 때 실행됩니다. 과업이 생성되고 계정과 관련이 있는 경우, 과업이 생성되는 동안 상위 계정에 잠금을 적용합니다. 따라서 과업 생성이 진행 중인 동안 계정을 업데이트할 수 없습니다.
Locking Statements 사용을 줄입니다.

시나리오:
  1. 사용자 A가 Data Loader를 사용해 과업을 가져와 기존 계정 레코드에 할당합니다. 과업이 삽입되면 Apex 트리거가 발생합니다.
  2. 사용자 A가 Data Loader를 사용해 삽입을 시작한 후 단 2초가 지난 뒤에 사용자 B가 과업이 관련된 동일한 계정 레코드를 수동으로 편집합니다.
  3. 사용자 B가 저장을 클릭하면 계정에 잠금을 적용하려고 시도하지만, 계정이 이미 잠겨 있으므로 잠금을 하나 더 적용할 수 없습니다. 과업 생성을 통해 계정이 이미 잠겼습니다.

다음, 2번째 트랜잭션에서 잠금이 제거되기를 기다립니다. 과업 생성에 약 14초 정도 걸리므로 잠금이 14초 동안 유지됩니다. (사용자 B의) 두 번째 트랜잭션은 최대 10초까지만 기다릴 수 있으므로 시간 초과됩니다.

이 경우 사용자 B에게는 위에서 언급한 오류와 비슷한 오류가 화면에 표시됩니다. Apex 테스트를 프로덕션 데이터에 대해 실행할 경우에도 잠금이 발생할 수 있습니다.

c. 벌크 API 

벌크 API를 통해 레코드를 삽입하거나 업데이트하면 배치가 병렬 처리되므로 동일한 상위 레코드에서 여러 업데이트가 동시에 실행될 수 있습니다. 예를 들어 배치 두 개를 동시에 처리하는 중이고 배치 두 개에 동일한 상위 레코드를 가리키는 레코드가 포함되어 있는 경우 배치 중 하나가 상위 레코드에 잠금을 적용하려고 할 수 있으며, 그러면 다른 배치에서 10초 이내에 잠금을 적용할 수 없어 "행을 잠글 수 없음" 오류가 발생할 수 있습니다.

다음 두 가지 방법 중 하나로 이 문제를 방지할 수 있습니다.
  • 배치 크기 줄이기
  • 레코드를 병렬 모드 대신 직렬 모드로 처리하면 배치가 한 번에 하나씩 처리됩니다.
  • 주 레코드를 상위 레코드를 기준으로 정렬하면 병렬 모드 사용 시에 (상위 레코드가 같은) 서로 다른 하위 레코드가 다른 배치에 포함되지 않습니다. 

d. 마스터-세부 사항 관계

마스터-세부 사항 관계의 마스터 측 기록에 하위 레코드가 너무 많은(수천 개) 경우에도 세부 레코드를 편집할 때마다 마스터 레코드가 잠겨 이런 오류가 발생할 가능성이 큽니다. 세부 레코드가 많을수록 사용자가 이런 레코드를 편집함으로 인해 상위 레코드가 잠길 가능성이 커집니다. 

이 문제를 방지하기 위해, 일부 하위 레코드를 다른 상위 레코드로 옮겨 상위 레코드 하나에 연결된 하위 레코드의 양을 줄일 수 있습니다. 
Record Level Locking은 줄일 수 있는 일반적인 시나리오입니다.


문제 해결: 

1. 오류를 겪는 사용자는 디버그 로그를 유효화하여 문제를 초래하는 잘못된 트리거 / 플로 / 확인 규칙을 찾을 수 있습니다.

2. 동일한 개체에서 실행 중인 종속적 배경 작업이 있는지 확인합니다. 이런 작업이 있으면 해당 작업을 일시중지한 다음 행 잠금을 줄이기 위한 조치를 취해 보십시오. 


참조:
Salesforce Platform Record Locking and Concurrency
 
Knowledge 기사 번호

000387767

 
로드 중
Salesforce Help | Article