2013-08-24 3 views
1

동일한 질문을 다시 제기하면 죄송합니다. 데이터베이스 잠금에 대한 정보를 찾으려고했지만 마침내 혼란스러워했습니다. Syabse ASE를 사용 중이며 다음을 수행했습니다.데이터베이스 잠금 메커니즘 작동 방법

3 터미널에서 sybase에 연결하고 각 연결에서 트랜잭션을 시작했습니다.

트랜잭션 T1, T2, T3.

T1과 T2는 공유 모드

T1 및 T2에

잠금 테이블 샘플을 사용하여 공유 잠금을 획득는

T3는 오는 샘플 테이블을 업데이트하려고 선택 작업을 수행하는 그것을 위해 독점적 인 자물쇠가 필요합니다. 내가

을 사용했기 때문에 세트 잠금 (60)

가 T3의 업데이트 문이 60 초 후에 사망한다 기다립니다.

이제 T1은 배타적 잠금이 필요한 샘플 테이블을 업데이트하려고합니다. T2는 또한 샘플 테이블에서 공유 잠금을 보유하고 있으므로 T1이 현재 보유합니다. T1에는 대기 시간 제한이 없으므로 T2가 트랜잭션을 커밋하기 위해 무기한의 시간을 기다립니다.

이제 T2는 독점적 잠금이 필요한 샘플 테이블을 업데이트하려고합니다. T1은 또한 샘플 테이블에서 공유 잠금을 보유하고 있으므로 sybase는 dead lock을 감지하고 T2의 update 문을 kill 한 다음 T1의 update 문이 성공적으로 실행됩니다.

먼저 업데이트를 요청한 트랜잭션이 성공적으로 완료되고 다른 트랜잭션의 명령문이 sybase에 의해 종료된다고 가정하십시오.

이제 T2가 샘플 표를 다시 업데이트하려고합니다. T2는 무한정 보류 상태로 유지됩니다.

이제 T1이 샘플 표를 다시 업데이트하려고합니다. 이 시간 T1의 업데이트 문이 성공적으로 완료되고 T2가 아직 대기 중입니다.

이것은 내가 혼란스러워하는 곳입니다.

T2가 처음으로 업데이트를 요청했습니다. 죽은 자물쇠가 있으면이 시간 T1을 죽여야합니다.

T1이 이제 테이블을 처음 갱신 할 때 샘플 테이블에 대한 배타적 잠금을 자동으로 가지고 있다고 가정합니다.

트랜잭션 잠금이 자동으로 변경 될 수 있습니까?

그런 다음 나중에 T1에서 선택을 실행하여 정상적으로 작동했습니다. 독점 잠금이 해제되고 공유로 변경된다고 가정합니다.

다음으로 T1에서 업데이트를 실행했습니다. T1이 다시 완료되고 T2가 아직 대기 중입니다.

명시 적으로 잠금을 T1에서 공유로 변경해야합니까?

나는 이것을했다.나는 이

'shmdb'데이터베이스에 테이블 '샘플'고정되지 않은

이 메시지를 받았습니다 그런 다음

주 모드에서

잠금 테이블 샘플을 사용하여 공유에 자물쇠를 변경 시도 '공유'모드에서 잠금을 처리하는 이 발견 되었기 때문에 '공유'모드에 있습니다.

이제 T2의 상태를 확인했습니다. 아직도 기다리고있어.

그런 다음 T1에서 샘플 테이블을 업데이트하려고 시도했지만 T2는 여전히 대기 중입니다.

너무 많은 혼란.

어떻게하면 T1의 잠금을 변경할 수 있습니까? 트랜잭션을 커밋하면 잠금이 해제되고 T2가 정상적으로 실행됩니다.

유일한 방법입니까?

+0

아무도 교착 상태를 방지하는 방법을 알려주시겠습니까? 지금까지 많은 문서를 읽었지만 구현할 수는 없습니다. 나는 이것이 작은 화제가 아니라는 것을 안다. 실용적인 예제와 좋은 링크가 필요합니다. sybase 예제가있을 수 있습니다. 나는 sybase 문서에 나열된 예제를 연습하려고 시도했지만 아무도 성공하지 못했습니다. –

답변

0

트랜잭션 T2가 테이블을 업데이트하려고 시도하는 동안 T1이 이미 테이블에서 공유 잠금을 보유하고 있다고 가정합니다. T2는 T1 릴리스 공유 잠금 또는 단독 잠금을 보유 할 때까지 업데이트 할 수 없습니다.

트랜잭션 T1 보류 잠금이 해제 될 때까지 원하는 횟수만큼 테이블을 업데이트 할 수 있습니다.

예 .. 당신 말이 맞습니다. 커밋 또는 롤백은 테이블 잠금 만 해제합니다.

교착 상태를 최소화하는 다른 방법은 다른 트랜잭션에서 사용하지 않는 테이블의 다른 행을 업데이트 할 수있는 테이블에 대한 행 잠금을 유지하는 것입니다.