7.24 LOCK TABLES/UNLOCK TABLES 구문 MySQL은 트랜잭션 환경을 지원하지 않습니다. 믿습니다!!!

3703 단어
LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE}
            [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
LOCK TABLES는 현재 스레드 잠금표입니다.UNLOCK TABLES 현재 라인에 있는 모든 자물쇠를 방출합니다.라인이 다른 LOCK TABLES를 보낼 때나 서버의 연결이 닫힐 때 현재 라인이 잠긴 모든 테이블이 자동으로 해제됩니다.
만약 한 라인이 한 테이블의 자물쇠 READ 를 얻게 된다면, 이 라인 (모든 다른 라인) 은 테이블에서만 읽을 수 있습니다.만약 한 라인이 시계의 WRITE 자물쇠를 얻게 된다면, 자물쇠를 가진 라인READ이나 WRITE표만 있고 다른 라인은 막힌다.
모든 스레드가 요청한 모든 자물쇠를 얻을 때까지 기다립니다.WRITE 자물쇠는 일반적으로 READ 자물쇠보다 우선순위가 높아서 변경 사항이 빨리 처리될 수 있도록 합니다.이것은 한 라인이 READ 자물쇠를 얻고 다른 라인이 WRITE 자물쇠를 요청하면 그 다음READ 자물쇠 요청은 WRITE 라인이 자물쇠를 얻고 풀릴 때까지 기다린다는 것을 의미한다.라인이 WRITE 자물쇠를 기다리고 있을 때 LOW_PRIORITY WRITE를 사용하면 다른 라인이 READ 자물쇠를 얻을 수 있습니다.만약 당신이 마침내 라인이 없으면 READ 자물쇠가 있을 것이라고 확신한다면, 당신은 LOW_PRIORITY WRITE만 사용해야 합니다.LOCK TABLES를 사용할 때, 사용할 모든 시계를 잠가야 합니다.만약 당신이 검색에서 시계를 여러 번 사용하고 있다면, 모든 별명에 대해 자물쇠를 가져야 합니다.이 정책 보증표는 잠겨 있지 않을 것이다.
사용 중인 INSERT DELAYED 시계를 잠그지 마십시오. 이 경우 INSERT 다른 라인이 실행되기 때문입니다.
보통, 모든 단일 UPDATE 문장이 원어이기 때문에 표를 잠글 필요가 없다.SQL 문을 실행하는 다른 스레드를 방해하는 다른 스레드는 없습니다.시계를 잠그고 싶으면 다음과 같은 상황이 있다.
  • 한 무더기의 시계에서 많은 조작을 실행할 경우, 사용하는 시계를 잠그는 것이 비교적 빠르다.물론 다른 라인이 READ 잠긴 시계를 업데이트할 수 없고, 다른 라인이 WRITE 잠긴 시계를 읽을 수 없다는 단점이 있다.
  • MySQL은 업무 환경을 지원하지 않기 때문에 SELECTUPDATE 사이에 다른 라인이 오지 않도록 하려면 LOCK TABLES를 사용해야 합니다.다음 예제에서는 안전하게 실행할 수 있도록 LOCK TABLES해야 합니다
    mysql> LOCK TABLES trans READ, customer WRITE;
    mysql> select sum(value) from trans where customer_id= some_id;
    mysql> update customer set total_value=sum_from_previous_statement
               where customer_id=some_id;
    mysql> UNLOCK TABLES;
  • .
    없음 LOCK TABLES, 다른 라인은 실행 SELECTUPDATE 문장 사이를 trans 표에 새 줄을 삽입할 수 있습니다.
    점증변경(UPDATE customer SET value=value+new_value이나 LAST_INSERT_ID() 함수를 사용하면 많은 경우LOCK TABLES를 피할 수 있습니다.
    사용자급 잠금 함수GET_LOCK()RELEASE_LOCK()를 사용하여 일부 상황을 해결할 수 있습니다. 이 잠금은 서버의 해시표에 저장되어 있고 pthread_mutex_lock()pthread_mutex_unlock()로 높은 속도를 얻을 수 있습니다.7.4.12 기타 함수 참조.
    잠금 정책에 대한 자세한 내용은 10.2.8 MySQL에서 테이블을 잠그는 방법을 참조하십시오.
     
     
    MySQL의 모든 잠금은 잠기지 않습니다.이것은 항상 하나의 조회 전에 필요한 모든 잠금을 즉시 요청하고 항상 같은 순서로 표를 잠그는 것을 통해 관리한다.
    MySQL은 WRITE에 다음과 같은 잠금 방법을 사용합니다.
  • 시계에 자물쇠가 없으면 그 위에 자물쇠를 놓아라.
  • 그렇지 않으면 잠금 요청을 쓰기 잠금 대기열에 넣습니다.

  • MySQL은 READ에 다음과 같은 잠금 방법을 사용합니다.
  • 시계에 잠금이 적혀 있지 않으면 읽기 잠금을 위에 놓으세요.
  • 그렇지 않으면 잠금 요청을 읽기 잠금 대기열에 넣습니다.

  • 잠금이 풀렸을 때, 잠금은 잠금 대기열의 라인을 쓰고, 그 다음에 잠금 대기열의 라인을 읽을 수 있습니다.
    이것은 테이블에 많은 변경 사항이 있으면 SELECT 문장이 더 이상 변경되지 않을 때까지 기다린다는 것을 의미한다.
    한 테이블에서 많은 INSERTSELECT 조작을 하는 상황을 해결하기 위해 임시 테이블에 줄을 삽입하고 가끔 임시 테이블에서 온 기록으로 실제 테이블을 업데이트할 수 있다.
    다음과 같은 코드를 사용할 수 있습니다.
    mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
    mysql> insert into real_table select * from insert_table;
    mysql> delete from insert_table;
    mysql> UNLOCK TABLES;
    

    만약 특정한 상황에서 검색의 우선순위를 구분한다면, LOW_PRIORITY 옵션의 INSERT 을 사용할 수 있습니다.7.14 INSERT 문법 참조.
    "mysys/thr lock.c"의 잠금 코드를 바꾸어서 하나의 대기열을 사용할 수 있습니다.이 경우 쓰기 잠금과 읽기 잠금은 같은 우선 순위가 있어 일부 프로그램에 도움이 될 수 있습니다.

    좋은 웹페이지 즐겨찾기