대화 그룹 잠금

Service Broker에서는 대화 그룹 잠금을 사용하여 지정된 시간에 단 하나의 큐 판독기에서만 관련 메시지 집합에 대한 작업을 수행할 수 있도록 합니다. 또한 대화 그룹 잠금을 사용하여 메시지가 순서대로 정확히 한 번만 처리되도록 합니다.

모든 대화는 하나의 대화 그룹에 속합니다. 기본적으로 각 대화는 서로 다른 대화 그룹에 속하므로 대화 그룹 식별자도 서로 다릅니다. MOVE CONVERSATION 문은 대화의 대화 그룹을 변경합니다. BEGIN DIALOG CONVERSATION 문에는 새 대화를 기존 대화 그룹과 연결하기 위한 옵션이 있습니다. 대화 그룹에 대한 자세한 내용은 대화 그룹을 참조하십시오.

대화 그룹 잠금은 실제로는 대화 그룹 식별자가 같은 일련의 메시지에 대한 배타적 잠금입니다. 대화 그룹 잠금은 단순성, 효율성 및 정확성을 높이기 위한 기능입니다. 대화 그룹 잠금을 획득하거나 해제하기 위한 명시적인 명령 또는 힌트는 없습니다. 대신 대화 그룹에 영향을 주는 모든 Service Broker 명령이 자동으로 적절한 대화 그룹 잠금을 획득합니다. 예를 들어 BEGIN DIALOG 문은 새 대화가 속하는 대화 그룹을 잠그며, RECEIVE 문은 받은 메시지가 속하는 대화 그룹을 잠급니다.

세션에서는 해당 세션이 잠금을 획득한 트랜잭션이 수행되는 동안 대화 그룹 잠금을 유지하며, 여러 트랜잭션 간에 대화 그룹 잠금을 유지할 수는 없습니다. 즉, 한 트랜잭션이 종료되면 해당 트랜잭션 중 획득한 모든 대화 그룹 잠금이 해제됩니다.

잠금은 대화 ID가 아니라 대화 그룹에 대해 수행됩니다. 따라서 대화 시작자와 대상이 모두 동일한 데이터베이스에 있더라도 대화의 한 쪽에만 잠금이 적용됩니다. 대상 서비스에서 잠금을 획득할 경우 시작 서비스는 차단되지 않으며 그 반대의 경우도 마찬가지입니다. 또한 데이터베이스 엔진은 들어오는 메시지를 큐에 추가할 때는 잠금을 적용하지 않습니다. 데이터베이스 엔진은 메시지가 속하는 대화 그룹에 대한 잠금을 응용 프로그램에서 유지하고 있더라도 큐에 해당 메시지를 추가합니다.

실질적으로 이는 Service Broker에서 검색된 식별자만 사용하는 응용 프로그램이 Service Broker 리소스에 대한 잠금을 획득할 때까지 기다릴 필요가 없음을 의미합니다. 대부분의 Service Broker 응용 프로그램은 Service Broker에서 제공하는 잠금을 활용하도록 설계되어 있습니다. 즉, 대부분의 Service Broker 응용 프로그램에서는 동일한 트랜잭션 내에서 Service Broker 문을 통해 얻은 대화 핸들과 대화 그룹 식별자만 사용합니다.

예를 들어 응용 프로그램에서는 일반적으로 Service Broker에서 대화 그룹 식별자를 가져오고, 상태 테이블에서 상태를 검색한 다음 해당 대화 그룹의 대화에 대한 메시지를 처리합니다. 응용 프로그램에서 대화 그룹 식별자를 가져온 후에는 이 응용 프로그램에서 해당 대화 그룹에 대한 잠금을 유지하므로 응용 프로그램의 다른 인스턴스에서는 잠금을 획득할 수 없습니다. 하지만 이 대화 그룹이 잠겨도 응용 프로그램의 다른 인스턴스에서는 다른 대화 그룹에 대한 메시지를 받을 수 있으며 들어오는 메시지가 큐에 도달할 수도 있습니다.

Service Broker에서는 이러한 잠금 전략을 통해 메시지가 순차적으로 처리되도록 할 수 있습니다. 특정 대화 그룹에 대한 메시지는 하나의 큐 판독기에서만 처리할 수 있으므로 두 개의 큐 판독기에서 동시에 동일한 대화 그룹의 메시지를 받을 위험이 없습니다. RECEIVE 문은 특정 대화에 대한 메시지를 받은 순서대로 반환하므로 순서를 명시적으로 조정하지 않고도 여러 큐 판독기에서 큐의 메시지를 처리할 수 있습니다.

잠금은 개별 대화가 아니라 대화 그룹에 대해 적용되므로 RECEIVE 문에서 특정 대화를 지정하지 않은 큐 판독기에서는 동일한 대화 그룹에 속하는 다른 대화의 메시지를 받을 수 있습니다. 또한 RECEIVE 문은 메시지가 속하는 대화 그룹이 현재 트랜잭션에서 잠금 해제되어 있는지 잠겨 있는지에 관계없이 큐의 사용 가능한 다음 메시지를 반환합니다. 특정 대화에서 메시지를 받으려면 RECEIVE 문에서 대화 핸들을 지정합니다. 특정 대화 그룹에서 메시지를 받으려면 RECEIVE 문에서 대화 그룹 식별자를 지정합니다.

이 잠금 전략의 결과로 응용 프로그램에서는 응용 프로그램의 상태 테이블을 업데이트하기 전에 대화 그룹 잠금을 획득해야 합니다. 대부분 이 작업은 응용 프로그램에서 메시지를 받거나 대화 그룹을 가져올 때 자동으로 수행됩니다. 하지만 오류를 처리할 때는 응용 프로그램에서 상태 테이블을 업데이트하여 오류를 나타내기 전에 대화 그룹 잠금을 다시 획득해야 합니다. 오류 처리에 대한 자세한 내용은 Service Broker의 오류 처리를 참조하십시오.

대화 그룹 잠금을 획득하는 문은 다음과 같습니다.