2009-04-23 3 views
4

서버 팜에서 작업을 동기화하는 잘 알려진 최상의 방법이 있습니까? 예를 들어 서버 팜에서 실행중인 포럼 기반 웹 사이트가 있고 데이터베이스의 여러 테이블에 쓰기 작업이 필요한 두 명의 중재자가 있으며 해당 중재자의 요청이 서버의 다른 서버에서 처리되고있는 경우 팜에서는 같은 항목에 대해 동시에 작업을 수행 할 수 없도록 잠금 기능을 구현할 수 있습니까?서버 팜에서 잠금을 구현하는 방법은 무엇입니까?

지금까지 데이터베이스의 테이블을 동기화하여 사용하려고 생각했습니다. 표에있는 항목의 ID를 확인한 후 삽입하십시오. 그렇지 않으면 리턴하십시오. 또한 아마도 공유 캐시가이 용도로 사용될 수 있지만 지금은 사용하지 않을 것입니다.

다른 방법이 있습니까?

그건 그렇고, MySQL을 데이터베이스 백엔드로 사용하고 있습니다.

+0

동시에 데이터베이스 서버에 액세스하려고하는 요청이 여러 개 있습니다. 다른 서버에 있다고해서 실제로 많이 바뀌지는 않습니다. – jfclavette

+0

좋아요,하지만 동시에 여러 레코드에 영향을 주므로 첫 번째 요청이 아직 실행 중일 때 다른 레코드가 동일한 레코드에 영향을 미치기를 원하지 않습니다.간단히 말해서 C#에서는 lock 키워드와 같은 것을 원하지만 분산 된 방식으로 작업하기를 원합니다. –

답변

1

모든 상태가 (중앙) 데이터베이스에 있으면 데이터베이스 트랜잭션이이를 처리해야합니다.

당신은 할 수 있습니다 http://en.wikipedia.org/wiki/Transaction_(database)

+0

내가 이해하는 한, 트랜잭션은 트랜잭션의 모든 명령문이 실행되거나 전혀 수행되지 않도록 보장하는 데 사용됩니다. 어떻게 잠금 또는 스레드 안전과 관련이 있습니까? 트랜잭션이 영향을받는 모든 테이블 (트랜잭션과 관련된 테이블)을 잠 그거나 트랜잭션이 완료 될 때까지 다른 트랜잭션을 잠 그거나 차단합니까? –

2

Zookeeper로 분산 잠금 서비스를 조사하기 위해 참조하십시오. 애플리케이션을위한 매우 빠른 분산 리소스 잠금 조정을 제공하는 Google 서비스의 재 구현입니다. 웹 앱에 통합하는 것이 얼마나 쉬운 지 모르겠습니다.

0

잠금 장치가있는 테이블은 간단하고 올바르게 작동하는 방법입니다.

SOA 접근 방식과 같은 단일 서버에서 코드를 서비스로 사용할 수도 있습니다.

마지막으로 데이터를 가져온 이후로 타임 스탬프가 변경된 경우 트랜잭션과 함께 TimeStamp 필드를 사용할 수도 있습니다. 누군가가 먼저 들어 오면 우선 순위가 있습니다.

4

귀하의 질문은 데이터 수준 동시성 제어를 의미합니다.이 경우 RDBMS의 동시성 제어 메커니즘을 사용하십시오.

나중에 데이터 엔티티 (예 : 테이블 레코드 액세스)와 일대일로 매핑하지 않는 애플리케이션 수준 작업을 제어하려는 경우 도움이되지 않습니다. 일반적인 해결책은 응용 프로그램 수준의 의미를 이해하고 필요한 경우 직렬화하는 역방향 프록시 서버입니다. (이는 가용성에 부정적인 영향을 미칩니다.)

CAP 정리를 읽는 것이 좋습니다.

0

질문이 오래 되었기 때문에 당신과 관련이 없지만 여전히 다른 사람들에게 유용 할 수 있으므로 어쨌든 게시하겠습니다.

잠금 개체에 대해 "SELECT FOR UPDATE"db 쿼리를 사용할 수 있으므로 실제로 잠금 메커니즘을 달성하기 위해 db를 사용합니다.

ORM을 사용하는 경우에도 수행 할 수 있습니다. 예를 들어 nhibernate에서 할 수있는 작업은 다음과 같습니다.

session.Lock(Member, LockMode.Upgrade); 
관련 문제