2012-04-02 3 views

답변

2

오라클은 대부분 MVCC를 사용하여 데이터베이스의 데이터에 대한 액세스를 제어합니다.

Informix와 DB2 (다른 DBMS)는 대부분 시간 잠금을 사용합니다. 문제의

UNLOCK TABLE tablename; 

데이터베이스가 기록되어있는 경우 (정상 상태 : 데이터베이스가 기록되어 있지 않은 경우

LOCK TABLE tablename IN { SHARE | EXCLUSIVE } MODE; 

, 당신이있는 테이블을 잠금을 해제 할 수 있습니다 :

테이블을 잠글 수있는 문이있다), 트랜잭션 내에서만 테이블을 잠글 수 있고 트랜잭션이 확약되거나 롤백 될 때 잠금이 해제됩니다.

또한 FOR UPDATE 절이있는 커서는 행에 잠금을 적용합니다. 읽기 잠금 기간은 분리 레벨에 따라 다르므로 격리 수준에 대해 알아야합니다. 행이 변경되기 때문에 업데이트 잠금은 항상 트랜잭션의 끝까지 지속됩니다.

실제로 REPEATABLE READ (일명 SERIALIZABLE —)는 Informix의 격리 수준과 표준 격리 수준의 복잡한 이야기가 있습니다. 모든 문은 처리 된 행과 어떤 행을 결정하는 데 사용되는 잠금에도 적용됩니다. 행이 처리되었습니다. 이는 격리를 보장하는 데 필요합니다.

+0

나는 당신이 말하는 것을 이해하지만 행이나 테이블을 차단하는 것에는 관심이 없다. 내가 존재하지 않는다면 PK (외부 적으로 생성 된)를 삽입하고 그것이 존재한다면 카운트를 갱신하는 오랜 수명의 저장 프로 시저를 가지고 있다고 가정 해 봅시다 (순진한 예). 해당 SP에 대한 두 건의 호출이 동시에 발생하면 둘 다 PK를 삽입하려고하기 때문에 그 중 하나가 실패합니다. PL/SQL에서 (dbms_lock.acquire를 통해) 상호 배제를 보장하기 위해 세마포어를 사용할 수 있습니다. 가능하다면 Informix에서도 똑같이하고 싶습니다. – Samuel

+1

올바른 제약 조건 (중복 값이 ​​허용되지 않음)을 사용하면 두 프로 시저 중 하나만 주어진 PK 값을 삽입 할 수 있습니다. DBMS는 자동으로이를 담당합니다. SPL (저장 프로 시저 언어)에는 삽입 실패를 복구하는 데 사용할 수있는 예외 메커니즘이 있습니다. 내가 말한대로 자물쇠를 추가하는 데 큰 이점이 있는지 확신하지 못합니다. 그것들은 시스템에 내장되어 있지는 않지만 정말로 그렇게하고 싶다면 상당히 쉽게 시뮬레이션 할 수 있습니다. 그러나 그렇게하기 위해 (코드를 변경하지 않는 것 이외에) 이점이 있다는 것을 확신하지 못합니다. –

+0

Oracle DBMS_LOCK에 관한 한 기사는 Oracle에서 필요한 이유 중 하나는 한 세션이 다른 세션의 업데이트를 볼 수 없다는 것을 나타냅니다. Informix 또는 기타 잠금 기반 DBMS에서는 문제가되지 않습니다. 격리 수준에 따라 세션은 다른 세션에서 커밋 된 다른 세션의 변경 사항을 볼 수 있습니다. Informix에서 해결해야 할 문제가 있는지 여부를 파악할 수있는 기회가 오라클에서 필요하지만 오라클은 잠금 기능이 필요한 이유에 대한 자세한 예를보아야합니다. 완료, 나는 그들이 Informix에 대한 필요성을 확신하지 못합니다. –