2010-08-06 3 views
6

는 좀 오라클 차단 방법에 대한 이해 - 트랜잭션이 완료 될 때까지 업데이트는 다른 업데이트를 차단하는 방법, 작가 등 독자 내가 비관적 및 optimisic 잠금의 개념을 이해차단, 잠금 및 격리 수준 간의 관계는 무엇입니까?

, 그리고 전형적인 은행 교과서 예제에 대한 차단하지 않는 방법 잃어버린 업데이트 등을 잃어 버릴 수도 있습니다.

또한 JDBC 트랜잭션 격리 수준에 대해서도 이해합니다. 예를 들어, 커밋되지 않은 데이터를 보았을 때 만족 스럽습니다.

그러나 이러한 개념이 어떻게 관련되어 있고 상호 작용하는지에 대해서는 조금 퍼지기 마련입니다. 예를 들어 :

  • 오라클은 기본적으로 비관적 또는 낙관적 잠금을 제공하고 (그냥 두 두꺼비 세션에서 실험에 따라 별도의 업데이 트를 차단하는 것 .)
  • , 만약 내가이 의심으로 응용 프로그램 수준 개념은 무엇입니까 잠금 전략을 구현하는 데 문제가있어서 데이터베이스가 트랜잭션을 동기화하도록 업데이트를 수행 할 수 있습니까?
  • 내 응용 프로그램 외의 다른 클라이언트가 다른 격리 수준으로 액세스 할 때 트랜잭션 격리 수준 (연결에서 설정 한)은 데이터베이스 동작을 어떻게 변경합니까?

이 주제를 명확히 설명하는 단어는 정말 고맙겠습니다.

+0

귀하의 질문 중 몇 가지 (특히 다른 고객간에 영향을 미칠 수 있음)에 대한 답변은 다음에서 확인할 수 있습니다. http://en.wikipedia.org/wiki/Isolation_%28database_systems%29 –

답변

3
  • 오라클은 두 가지 유형의 잠금을 허용합니다. 즉, 앱을 빌드하는 방법에 따라 사용되는 내용이 결정됩니다. 되돌아 보면, 그것은 실제로 데이터베이스 결정이 아닙니다.

  • 대부분 Oracle의 잠금은 데이터베이스에 대한 상태 저장 연결로 충분합니다. 웹 앱과 같이 상태가 아닌 앱에서는 사용할 수 없습니다. 잠금은 세션에 적용되므로 이러한 상황에서는 응용 프로그램 수준 잠금을 사용해야합니다.

  • 일반적으로 걱정할 필요가 없습니다. 오라클에서 독자는 작가를 결코 차단하지 않으며 작가는 독자를 결코 차단하지 않습니다. 오라클의 행동은 다양한 ANSI 격리 수준에 따라 변하지 않습니다. 예를 들어 오라클에는 "더티 읽기"같은 것이 없습니다. Tom Kyte는 더티 읽기를 허용하는 정신은 오라클에서 문제가되지 않는 읽기 차단을 피하는 것이라고 지적합니다.

톰 키트 (Tom Kyte)의 훌륭한 저서 "Expert Oracle Database Architecture"를 읽어 보시기 바랍니다.

+0

오라클은 다른 행동으로 몇 가지 다른 격리 수준을 가지고 있습니다 . 예를 들어 serilizable은 정상 격리 수준에서는 보이지 않는 커밋시 "트랜잭션을 초기화 할 수 없습니다"오류가 발생할 수 있습니다. –

+0

이것은 내가 알고있는 유일한 예외이며 일반적으로 사용되지는 않습니다. 당신이 그것을 사용해야 할 경우, 당신은 이것을 알고 있어야합니다.오라클의 다중 버전 구현은 다른 ANSI 격리 수준을 처리합니다. – DCookie

2

기본적으로 낙관적 잠금은 "데이터를 읽을 때가 아니라 데이터를 수정할 때만 데이터를 잠글 것입니다."입니다. 데이터를 잠그지 않으면 다른 사람이 이전에 변경하고 오래된 뉴스를보고있는 것입니다 (그리고 데이터를 읽고 업데이트했을 때 맹목적으로 변경된 내용을 덮어 쓸 수 있습니다).)

비관적 잠금은 읽을 때 데이터를 잠그기 때문에 아무도 변경하지 않았 음을 확신 할 수 있습니다.

이 애플리케이션 결정하지 오라클 결정이다 : A = 2

이 일치하는 레코드하지만

SELECT X를 잠글 것이다 표 FROM

SELECT X, Y, Z, y, z FROM table1 여기서 a = 2 FOR 업데이트 날짜

됩니다. 그래서 당신은

UPDATE table1 
    SET x = 1, y = 2, z = 3 
WHERE a = 2 

가 (당신이 다른 한편에서 만든 변경 누군가를 덮어 수도) ... 당신은 낙관적이 이
SELECT x, y, z FROM table1 WHERE a = 2 

... 시간이 지남에

잠금으로 확인 있다면 결정해야

또는 비관적해야합니다

SELECT x, y, z FROM table1 WHERE a = 2 FOR UPDATE 

... 시간이지나 ...

UPDATE table1 
    SET x = 1, y = 2, z = 3 
WHERE a = 2 

는 (당신은 당신이 그것을 쿼리 이후 아무도 데이터를 변경되지 것을 확신합니다.) 오라클에서 사용할 수있는 격리 수준 여기

확인합니다. http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/consist.htm#CNCPT621

1

오라클은 항상 비관적 잠금을 처리합니다. 즉, 업데이트 될 때 레코드가 잠기 게됩니다 (키가 관련된 경우 삭제 및 삽입을 위해 잠금을 누를 수도 있습니다). 비관적 인 잠금 전략을 보강하려면 SELECT .... FOR UPDATE를 사용할 수 있습니다.

실제로 트랜잭션 방식으로 작동하는 데이터베이스/저장소 엔진은 어떤 형태의 잠금을 수행해야합니다.

SERIALIZABLE 격리 수준은 낙관적 잠금 메커니즘에 훨씬 가깝습니다. 트랜잭션이 트랜잭션 시작 이후 업데이트 된 레코드를 업데이트하려고 시도하면 예외가 발생합니다. 그러나 데이터베이스 세션과 최종 사용자 세션간에 일대일 방식을 사용합니다.

특히 사용자 활동이 많은 시스템에서 연결 풀링/상태 비 저장 응용 프로그램이 널리 보급됨에 따라 데이터베이스 세션을 장기간 사용하면 전략이 좋지 않을 수 있습니다. 낙관적 인 잠금이 선호되며 이후 버전의 Oracle에서는 ORA_ROWSCN 및 ROWDEPENDENCIES 항목과 함께이를 지원합니다. 기본적으로 레코드를 처음/마지막으로 본 이후로 레코드가 변경되었는지 쉽게 확인합니다.

데이터베이스 세션과 사용자 세션 간의 일대일 관계가 유산이되어 감에 따라 응용 프로그램 계층은 '사용자 세션'상태를 더 많이 보존하여 사용자 선택 사항을 확인하는 데 더 많은 책임을지게됩니다 5 분에서 10 분 전에 작성한 책은 여전히 ​​유효합니다 (예 : 책이 아직 재고가 있거나 누군가 다른 책을 구입 한 경우).

관련 문제