복붙노트

[SQL] 때 ... FOR UPDATE SELECT 사용 하는가?

SQL

때 ... FOR UPDATE SELECT 사용 하는가?

나 ... FOR UPDATE SELECT 뒤에 사용 사례를 이해하는 데 도움이 바랍니다.

질문 1 :이 SELECT ... FOR UPDATE를 사용해야 할 때의 좋은 예를 다음인가?

주어진:

이 응용 프로그램은 모든 객실과 태그를 나열하고 싶어하지만, 제거 된 객실 없음과 태그 방을 구별 할 필요가있다. SELECT ... FOR UPDATE를 사용하지 않는 경우, 어떤 일어날 수있는 것은 :

이제 1 방 1 태그가 없습니다 만, 실제로는 공간이 제거 된 것을 생각 스레드. 이 문제를 해결하기 위해 스레드 1하여 스레드 1이 완료 될 때까지 객실에서 삭제하는 나사 2를 방지, UPDATE위한 객실 FROM ID를 선택해야합니다. 그 맞습니까?

질문 2 : 하나 ... FOR UPDATE SELECT와 READ_COMMITTED 대 SERIALIZABLE 트랜잭션 격리를 사용해야합니까?

답변은 휴대용 (안 데이터베이스 별)가 될 것으로 예상된다. 제공 할 수없는 경우 그 이유를 설명하십시오.

해결법

  1. ==============================

    1.그들은 SELECT FOR UPDATE로 잠금되어 삭제 된 후 객실과 태그 및 확인 객실을 사이에 일관성을 유지하는 유일한 휴대용 방법은 반환되지 않습니다.

    그들은 SELECT FOR UPDATE로 잠금되어 삭제 된 후 객실과 태그 및 확인 객실을 사이에 일관성을 유지하는 유일한 휴대용 방법은 반환되지 않습니다.

    그러나 일부 시스템에서 잠금 동시성 제어의 부작용, 당신은 명시 적으로 FOR UPDATE를 지정하지 않고 동일한 결과를 얻을 수 있습니다.

    이것은 데이터베이스 시스템이 사용하는 동시성 제어에 따라 달라집니다.

    일반적으로, 반복 읽기 팬텀 행을 금지하지 않는 (오히려 수정되는 것이 아니라, 출연 또는 다른 트랜잭션에서 사라 행)

    참고 격리 모드에 대한 표준은 당신이 당신의 쿼리에서 특정 단점이 표시되지 않지만 (MVCC로하거나 또는 잠금으로) 방법을 정의하지 않음을 처방을한다는 것을.

    나는 "때문에 특정 데이터베이스 엔진 구현의 부작용"정말 추가해야 "당신이 UPDATE 선택 필요가 없습니다"말할 때.

  2. ==============================

    2.짧은 답변 :

    짧은 답변 :

    Q1 : 예.

    Q2 :합니까 당신이 사용하는 중요하지.

    긴 대답 :

    셀렉트 (는 의미로) 특정 행을 선택뿐만 아니라 그들이 이미 현재의 트랜잭션 (transaction)에 의해 업데이트 된 경우로 잠 깁니다 업데이트 (나처럼 정체성 업데이트를 수행했다). 이것은 현재의 트랜잭션 (transaction)에 다시 업데이트 한 다음 어떤 방식으로 이러한 행을 수정할 수있는 다른 트랜잭션없이, 커밋 할 수 있습니다.

    그것을 보는 또 다른 방법은 다음과 같은 두 개의 문이 원자 적으로 실행되는 경우 같습니다 :

    select * from my_table where my_condition;
    
    update my_table set my_column = my_column where my_condition;
    

    my_condition에 의해 영향을받는 행이 고정되어 있기 때문에, 다른 트랜잭션이 어떤 방식으로 수정할 수 없습니다, 따라서, 트랜잭션 격리 수준은 여기에 차이가 없습니다.

    참고 트랜잭션 격리 수준은 잠금의 독립 또한 : 다른 격리 수준을 설정하면 트랜잭션에 의해 잠긴 다른 트랜잭션에 잠금 및 업데이트 행 주위를 얻을 수 없습니다.

    트랜잭션이 진행되는 동안 어떤 트랜잭션 격리 수준이 (다른 수준에서) 보증을하는 것은 데이터의 일관성이다.

  3. from https://stackoverflow.com/questions/10935850/when-to-use-select-for-update by cc-by-sa and MIT license