2014-11-19 6 views
1

데이터베이스 제작시 교착 상태가 발생했습니다. anaylsis에 나는 2 개의 실에 의해 역순으로 자물쇠를 취했다는 것을 발견했다. 예 : -교착 상태에 접근하는 전략?

1)Thread 1 :- 처음으로 테이블 1 행에 대해 독점 행 잠금을 얻은 다음 테이블 2 행에 공유 행 잠금을 얻으려고합니다.

2)Thread 2:- 처음으로 테이블 2 행에 대해 독점 행 잠금을 얻은 다음 테이블 1 행에 대한 공유 행 잠금을 획득하려고했습니다.

따라서 데드락이 발생했습니다.

다행스럽게도 스레드 1에서와 동일한 순서로 잠금을 획득하여 스레드 2에서이를 해결할 수있었습니다. 즉, 이제 두 스레드가 모두 테이블 1에서 잠금을 획득 한 다음 테이블 2에서 잠금을 획득하려고합니다. 그래서 교착 상태가 해결되었습니다.

여기서 사소한 변경과 관련하여 여기에서 잠금 주문을 변경하는 것이 가능했습니다. 하지만 일부 시나리오에서는 으로 인해 비즈니스 기능으로 인해 불가능하거나 응용 프로그램의 주요 변경이 필요할 수도 있습니다. 그래서 나는 두 가지 다른 방법을 생각할 수 있습니다. 이러한 종류의 교착 상태 (데이터베이스 잠금 또는 java 잠금 여부)를 해결할 수 있습니다. 그들은 : -

내가 생각할 수있는 또 다른 방법입니다

1) 작업을 시작하기 전에 캐시에 재진입 잠금을 유지해야 resorces

2

)에 사전에 잠금을 획득하는 비관적 잠금 스레드 1과 스레드 2는 첫 번째 스레드가 잠금을 해제 할 때까지 진행할 수 없습니다. 그러나 나는이 접근법으로 확신 할 수 없으므로 이런 종류의 코드로 애플리케이션을 채울 것이다. 또한 개발자는 잠금 해제 을 잊을 수 있습니다.

그래서 교착 상태를 해결하는 다른 대안 방법이 궁금합니다. 어떤 아이디어?

답변

0

데이터베이스에 테이블 (잠금 가능)을 만들고이 테이블에 잠긴 레코드의 기본 키를 저장할 수 있습니다.
업데이트하기 전에 주 테이블은 잠금 테이블에 레코드를 찾으려고합니다.
레코드가 없으면 잠금 테이블에서 업데이트 레코드를 만들고 선택합니다.
다른 스레드 및 응용 프로그램은 주 테이블을 업데이트하기 전에 잠금 테이블에 레코드를 확인합니다.
이런 방식의 보너스 - 애플리케이션은 메인 테이블의 데이터를 잠그지 않으며, 다른 프로세스는 메인 테이블의 데이터를 선택할 수 있습니다.

이 테이블에 대한 직렬화 가능 액세스를 어떻게 보장합니까?

모든 응용 프로그램은 lockrecords를 삽입하고이 레코드를 비관적으로 잠급니다 (업데이트 선택).

+0

이 테이블에 대한 직렬화 가능 액세스를 보장하려면 어떻게해야할까요? – zeller