2011-03-03 2 views
0

preparedStatements를 사용하여 Java J2EE에서 SQL Server 2005 테이블에 액세스하고 있습니다. jar는 두 개의 서버에 배포되고 동시에 실행됩니다. 다음과 같이 과정은 다음과 같습니다두 서버에서 동일한 테이블에 동시에 액세스

그들을
  • 가 이벤트 테이블 (에서 처리 된 이벤트를 삭제 2 단계가 실행되지 않은 경우 (사용자와 다른 이메일을 보낼 수) 이벤트 테이블에 새로운 사용자 이벤트
  • 과정에서 선택
    1. 확인은 삭제하지 말아야합니다.)

    2 개의 선택이 delete 문 앞에 동시에 실행되기 때문에 사용자는 2 개의 이메일 (각 서버에서 하나씩)을받는 경우가 있습니다. 테이블에 대한 관리자 권한이 없습니다. Java 응용 프로그램에서만 액세스 할 수 있습니다.

    처음 선택시 테이블을 잠그고 삭제 한 후에 잠금을 해제하려면 어떻게해야합니까? 다른 해결책이 있습니까? 당신이 트랜잭션 방식으로 일을 선택하는 경우

  • +1

    서버가 클러스터 구성에 두 노드가 있거나 동일한 데이터베이스에 동시에 액세스하는 두 개의 독립적 인 응용 프로그램입니까? –

    답변

    2

    , 하나 개의 서버를 선택할 수 있습니다 :

    set transaction isolation level repeatable read 
    
    update top 1 tbl 
    set  ProcessingOnServer = HOST_NAME() 
    from YourWorkTable tbl 
    where ProcessingOnServer is null 
         and Done = 0 
    

    지금 당신이 세부 사항을 선택할 수 있습니다, 작업 항목을 알고 안전하게에 할당 :

    select * 
    from YourWorkTable tbl 
    where ProcessingOnServer = HOST_NAME() 
         and Done = 0 
    

    함수 host_name()은 클라이언트 이름을 반환하지만보다 안전하다고 생각되면 클라이언트 응용 프로그램에서 호스트 이름을 전달할 수 있습니다.

    일반적으로 항목을 처리하는 데 너무 오래 걸린 서버를 확인할 수 있도록 타임 스탬프를 추가합니다.

    관련 문제