MySQL 사무의 격리 단계의 강함을 한 문장으로 맛보실 수 있습니다.

33186 단어 mysql
문서 목록
  • 1. 격리 단계 이론
  • 1.개념
  • 2.읽기 방법
  • 더티(dirty Read)
  • 중복 읽기 불가(nonrepeatable)
  • 판독(Phantom)
  • 잠금 읽기
  • 3.격리성 종류
  • READ UNCOMMITTED(커밋되지 않은 읽기)
  • READ COMMITTED(제출 읽기)
  • REPEATABLE READ(중복 읽기 가능)
  • SERIALIZABLE(직렬화)
  • 2. 격리 수준 실현
  • 실험 환경
  • 1.READ UNCOMMITTED(커밋되지 않은 읽기)
  • 2.READ COMMITTED(커밋 읽기)
  • 3.REPEATABLE READ(중복 읽기 가능)
  • 4.SERIALIZABLE
  • 셋째, 사라진 자물쇠
  • 1. 격리 단계 이론
    1. 개념
    업무의 ACID 특성(ACID 상해)에서의 격리성(isolation)은 일반적으로 한 사무소의 수정이 최종적으로 제출되기 전에는 보이지 않는다. 즉, 한 사용자가 업무가 시작될 때 파일의 내용을 수정하고 다른 사용자가 이 파일을 볼 때 보이지 않는다.그렇다면 사용자가 실시간 업데이트를 수정해야 한다면 어떻게 해야 하는가. 사실 격리성은 하나의 것이 아니다. 여기서 제시한 격리성은 그 중의 하나일 뿐이고 격리성의 읽기 방식도 다르다. 격리성은 데이터를 읽는 방식에 따라 구분된다.
    2. 읽기 방법
    더티(dirty Read)
    두 개의 사무를 열면 한 사무에서 수정된 값으로 두 번째 사무도 볼 수 있다
    반복해서 읽을 수 없음
    두 개의 사무를 열고 한 사무에서 수정된 값을 제출하면 두 번째 사무도 볼 수 있습니다. 제출하지 않고 수정만 하면 볼 수 없습니다.
    판독(Phantom)
    두 개의 사무를 열고 한 사무에서 값을 수정하여 제출하지만, 두 번째 터미널은 사무에서 원래의 값을 보존하고, 이를 환독이라고 부르지 않습니다
    자물쇠를 채워 읽다
    하나의 사무가 값을 수정할 때, 다른 사무는 동시에 조작할 수 없고, 기다릴 수 있다
    3. 격리성 종류
    READ UNCOMMITTED(읽기 커밋되지 않음)
    더러운 읽기 지원 중복 읽기 불가 및 판독 지원
    READ COMMITTED(커밋 읽기)
    중복 읽기 불가 및 판독 지원
    REPEATABLE READ(중복 읽기 가능)
    판독 지원
    SERIALIZABLE(직렬화)
    잠금 읽기 지원
    2. 격리 수준 실현
    실험 환경
    두 개의 터미널을 열면 각각 (잭) 과 (루스) 이고, 뒤에는 잭과 루스로 터미널 이름을 붙일 것이다.
    create database test;
    create table list1(id int primary key, name char(10));
    insert into list1(id,name) values(1,'  '),(2,'   ');
    #                
    
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    +----+--------+
    2 rows in set (0.00 sec)
    mysql> desc list1;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | id    | int      | NO   | PRI | NULL    |       |
    | name  | char(10) | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    

    1. READ UNCOMMITTED(커밋되지 않은 읽기)
    1) 잭: 격리 단계를 수정하고 보기;트랜잭션 열기
    mysql> set session transaction isolation level read uncommitted;
    mysql> select @@transaction_isolation ;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | READ-UNCOMMITTED        |
    +-------------------------+
    1 row in set (0.00 sec)
    mysql> start transaction;
    

    2) 루스: 트랜잭션 오픈
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    

    3) 잭: 데이터 삽입
    mysql> insert into list1 values(3,'   ');
    #    
    

    3) 루스: 표내 데이터 보기
    #         
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    |  3 |     |
    +----+--------+
    3 rows in set (0.00 sec)
    

    4) 잭: 트랜잭션 롤백
    mysql> rollback;
    #    
    

    5)이슬
    #                      
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    +----+--------+
    2 rows in set (0.00 sec)
    

    잭 단말기에서 사무를 열고 데이터를 삽입한 후 루스에서 사무를 열어도 볼 수 있다는 것을 더러운 읽기라고 한다.
    2. READ COMMITTED(커밋 읽기)
    1) 잭: 격리 단계를 수정하고 보기;트랜잭션 열기
    mysql> set session transaction isolation level read committed;
    mysql> select @@transaction_isolation ;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | READ-COMMITTED          |
    +-------------------------+
    1 row in set (0.00 sec)
    mysql> start transaction;
    

    2) 루스: 사무교체 격리 레벨 오픈
    mysql> set session transaction isolation level read committed;
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    

    3) 잭: 데이터 삽입
    mysql>  insert into list1 values(3,'   ');
    

    4) 루스: 데이터 보기
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    +----+--------+
    2 rows in set (0.00 sec)
    

    5) 잭: 데이터 제출
    mysql> commit;
    

    6) 루스: 데이터 보기
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    |  3 |     |
    +----+--------+
    3 rows in set (0.00 sec)
    

    위에서 알 수 있듯이 잭이 업무를 시작하고 데이터를 삽입한 후에 루스는 잭이 데이터를 제출해야만 루스가 데이터를 볼 수 있다는 것을 바로 볼 수 없다. 이것은 제출독이다. 하나의 업무가 시작부터 제출되기 전까지 모든 수정은 다른 업무에 보이지 않고 중복독이라고도 부른다.
    3. REPEATABLE READ(중복 읽기 가능)
    1) 잭: 격리 단계를 수정하고 보기;트랜잭션 열기
    mysql> set session transaction isolation level REPEATABLE READ;
    mysql> select @@transaction_isolation ;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | REPEATABLE-READ         |
    +-------------------------+
    1 row in set (0.00 sec)
    mysql> start transaction;
    

    2) 루스: 사무교체 격리 레벨 오픈
    mysql> set session transaction isolation level REPEATABLE READ;
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    

    3) 잭: 데이터 삽입
    mysql> insert into list1 values(4,"   ");
    

    4) 루스: 데이터 보기
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    |  3 |     |
    +----+--------+
    3 rows in set (0.00 sec)
    

    5) 잭: 트랜잭션 제출
    mysql> commit;
    

    6) 루스: 트랜잭션 제출, 데이터 보기
    mysql> commit;
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    |  3 |     |
    |  4 |     |
    +----+--------+
    4 rows in set (0.00 sec)
    

    위에서 알 수 있듯이 잭이 업무를 시작하고 데이터를 삽입한 후에 업무를 시작한 루스는 잭이 삽입한 데이터를 직접 보지 않았다. 잭이 업무를 제출한 후에도 루스는 데이터를 보지 못했다. 루스가 자신의 업무를 제출한 후에야 잭이 삽입한 데이터를 보았다. 이것은 반복해서 읽을 수 있고 최신 데이터를 읽을 수 없는 현상을 판독이라고 부른다.이 격리 레벨은 MySQL의 기본 격리 레벨입니다.
    4. SERIALIZABLE(직렬화)
    1) 잭: 격리 단계를 수정하고 보기;트랜잭션 열기
    mysql> set session transaction isolation level SERIALIZABLE;
    mysql> select @@transaction_isolation ;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | SERIALIZABLE            |
    +-------------------------+
    1 row in set (0.00 sec)
    mysql> start transaction;
    

    2) 루스: 사무교체 격리 레벨 오픈
    mysql> set session transaction isolation level SERIALIZABLE;
    mysql> start transaction;
    Query OK, 0 rows affected (0.00 sec)
    

    3) 잭: 데이터 삭제 및 보기
    mysql> delete from list1 where id=4;
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    |  3 |     |
    +----+--------+
    3 rows in set (0.00 sec)
    

    4) 루스: 데이터 보기
    #       ,             ,           。
    mysql> select * from list1;
    ^C -- query aborted
    ERROR 1317 (70100): Query execution was interrupted
    

    5) 잭: 데이터 제출
    mysql> commit;
    

    5) 루스: 데이터 보기
    #    ,       
    mysql> select * from list1;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 |      |
    |  2 |     |
    |  3 |     |
    +----+--------+
    3 rows in set (0.00 sec)
    

    위에서 알 수 있듯이 직렬화라는 격리 단계는 두 업무가 같은 데이터를 동시에 방문할 수 없기 때문에 대량의 슈퍼마켓의 시간 초과와 잠금 분쟁을 초래할 것이다.데이터의 일치성을 확보하고 병발이 없는 것을 받아들일 수 있어야 이 등급을 고려할 수 있다.
    3. 고정 자물쇠
    사쇄란 두 개 이상의 업무가 같은 자원에서 서로 점용하고 상대방이 점용하는 자원을 잠그도록 요청하여 악순환을 초래하는 현상을 말한다.만약에 두 사무 단말기에 아래의 두 문장을 동시에 입력하면 사순환에 빠질 것이다. 두 사무가 서로 상대방의 자물쇠에 빠졌기 때문에 데이터베이스 시스템은 각종 자물쇠 검사와 자물쇠 시간 초과 메커니즘을 실현했다.InnoDB 엔진이 잠금을 해제하는 방법은 배타적 잠금을 가진 업무를 잭에게 롤백하는 것입니다.
    mysql> start transaction;
    mysql> update list1 set name='  ' where id=3;
    mysql> update list1 set name='  ' where id=2;
    

    루스:
    mysql> start transaction;
    mysql> update list1 set name='  ' where id=2;
    mysql> update list1 set name='  ' where id=3;
    

    좋은 웹페이지 즐겨찾기