배타적 잠금 (X)
여기에 주로 배타적 잠금 분산 잠금에 대해 이야기합니다. 배타적 로크는 쓰기 잠금 또는 잠금 배타적으로 알려진 (X 잠금이라고 배타적 잠금은), 로크는 기본형이다. O1 만 T1을 허용 트랜잭션 T1 데이터 객체 O1 플러스 배타적 잠금, 잠금의 다음 기간은 읽고 다른 트랜잭션에 대한 업데이트 데이터가 조작 O1, 직선 T1 릴리스의 모든 유형이 될 수있는 경우 독점 잠금.
정의 잠금
사육사에서, 잠금 사육사에서 데이터 노드를 생성하여 표현 될 수있다. 예를 들면, / exclusive_lock / 잠금 노드 (znode)는 잠금과 같이 표현 될 수있다.
잠금 획득
단독 잠금을 얻기 위해 요구에서 할 수있는 모든 클라이언트는 임시 자식 노드 / exclusive_lock 노드에서 / exclusive_lock / 잠금을 생성, () 인터페이스를 만들려고하지만, 강력한 일관성 사육사 결승전은 하나의 고객을 보장합니다 성공적으로 클라이언트가 잠금을 획득 한 후 것을 만들었습니다. 동시에, 잠금을 획득하는 모든 클라이언트 거래는 대기 상태에있을 수 있습니다, 자식 노드 변경 감시자을 등록 할 수 있습니다 사전에 클라이언트의 대기 상태는 자식 노드의 상황을 변경하기 위해 실시간으로 모니터하기 위해, / exclusive_lock 노드에서 수신합니다.
잠금을 해제
수입 java.util.concurrent.TimeUnit을; 수입 lombok.Cleanup; 수입 lombok.SneakyThrows; 수입 org.apache.curator.RetryPolicy; 수입 org.apache.curator.framework.CuratorFramework; 수입 org.apache.curator.framework.CuratorFrameworkFactory; 수입 org.apache.curator.framework.recipes.locks.InterProcessMutex; 수입 org.apache.curator.retry.ExponentialBackoffRetry; 수입 org.apache.zookeeper.data.Stat; 공용 클래스 ZkLock { @SneakyThrows 공공 정적 무효 메인 (문자열 []에 args) { 마지막= 문자열 커넥트 "로컬 호스트를 : 로컬 호스트 2181 : 2182, 로컬 호스트 : 2,183가" ; // 전략을 시도 각 사이에 필요한 대기 시간은 초기화, 1 초 대기 시간 기준을 시도. RetryPolicy = RetryPolicy 새로운 새로운 ExponentialBackoffRetry (1000 ,. 3 ); // 사용 기본 세션 시간 (60초)와 연결 시간 (15초) 클라이언트 사육사 만들 @Cleanup CuratorFramework 클라이언트 = CuratorFrameworkFactory.builder을 (). 커넥트 (커넥트) . connectionTimeoutMs ( * 1000 15 .) sessionTimeoutMs ( 60 * 100 ). retryPolicy (retryPolicy). ) (빌드; // 클라이언트 시작 client.start를 (); 최종 문자열 lockNode = "/ lock_node"; InterProcessMutex 잠금 = 새로운 InterProcessMutex (클라이언트, lockNode); 시도 {이 // 가 사용할 때까지 차단 - 1. 획득 뮤텍스를. () lock.acquire; // 또는 // 2. 획득 뮤텍스 - 차단이 가능한, 또는 지정된 시간이 만료 될 때까지. 경우 (lock.acquire (60 , TimeUnit.MINUTES)) { 합계 합계 = client.checkExists () forPath (lockNode).; 경우 ( 널 (null) ! = 합계) { // 도트 트랜잭션 } } } 마지막으로{ 경우 (lock.isAcquiredInThisProcess ()) { lock.release (); } } } }