> 데이터 베이스 > MySQL 튜토리얼 > Mysql Innodb 트랜잭션 격리 수준이란 무엇입니까?

Mysql Innodb 트랜잭션 격리 수준이란 무엇입니까?

青灯夜游
풀어 주다: 2019-02-26 11:42:44
앞으로
1887명이 탐색했습니다.

이 기사에서는 Mysql Innodb 트랜잭션 격리 수준이 무엇인지 소개합니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

Mysql에는 다음과 같이 4가지 트랜잭션 격리 수준이 있습니다.

1. Read Uncommitted: 변경되었지만 다른 트랜잭션에 의해 커밋되지 않은 더티 데이터를 읽을 수 있으며 반복 불가능한 읽기로 이어질 수도 있습니다. 팬텀 읽기 문제 .

2. 읽기 커밋: 더티 데이터 읽기를 방지할 수 있지만 여전히 반복 불가능한 읽기팬텀 읽기가 발생합니다.

3. REPEATABLE-READ: MySQL의 기본 격리 수준은 팬텀 읽기를 발생시킵니다. 그러나 mysql은 이 수준에서 MVCC 일관성 읽기를 사용하며 팬텀 읽기를 생성하지 않습니다.

4. 직렬화 가능: 위의 문제를 방지할 수 있는 가장 높은 격리 수준입니다.

다음 방법을 사용하여 현재 시스템의 격리 수준을 확인할 수 있습니다.

mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
로그인 후 복사

Uncommitted readREAD-UNCOMMITTEDDirty read, 반복 불가능한 읽기 예:

#session A
mysql> set session transaction isolation level read uncommitted;   #设置隔离级别为未提交读
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from inno_tbl where id=2;
+----+------+
| id | name |
+----+------+
|  2 | John |
+----+------+
1 row in set (0.00 sec)
로그인 후 복사
#session B
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_tbl set name='Jack Ma' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
로그인 후 복사
#session A
mysql> select * from inno_tbl where id=2;
+----+---------+
| id | name    |
+----+---------+
|  2 | Jack Ma |
+----+---------+
1 row in set (0.00 sec)
로그인 후 복사

이때 세션 A는 세션 B의 수정되었지만 커밋되지 않은 데이터를 읽었습니다. 이때 세션 B가 롤백되면 A가 읽은 데이터는 유효하지 않습니다. ", A가 처음이기 때문에 처음 읽은 데이터는 두 번째 읽은 데이터와 다르기 때문에 "반복 불가능한 읽기"입니다. 마찬가지로 B에 새 데이터가 삽입되면 새 데이터도 함께 읽혀집니다. A에서 이 거래를 읽으세요. 좋습니다. 이것은 가상 읽기입니다.

동일한 프로세스에서 A의 격리 수준을 커밋된 읽기로 변경하면 "더티 읽기"는 발생하지 않지만 "반복 불가능한 읽기" 및 "팬텀 읽기"도 발생합니다.

기본 격리 수준 아래에서는 REPEATABLE-READ :

#session A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
로그인 후 복사
#session B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update inno_tbl set name='Lucy' where id=2; 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.03 sec)
로그인 후 복사
#session A
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
#注意,此时没有产生“不可重复读”问题,但若是为查询加上共享锁:
mysql> select * from inno_tbl1 where id=2 lock in share mode;
+----+---------+
| id | name    |
+----+---------+
|  2 | Lucy    |
+----+---------+
1 row in set (0.00 sec)
로그인 후 복사

설명:

세션 A의 트랜잭션은 ID가 2인 inno_tbl 테이블의 이름 필드를 John으로 읽고, 세션 B의 트랜잭션이 inno_tbl의 ID가 2인 이름을 Lucy로 변경하고 제출하면 , A의 트랜잭션이 나중에 이 데이터 행을 읽는 경우 select 메소드를 직접 사용하여 쿼리하면 읽은 데이터는 여전히 이전 데이터이고 공유 잠금을 사용하면 실제 데이터를 읽게 됩니다.

왜? innodb 엔진에서는 mysql의 추가, 삭제, 수정 및 쿼리문이 스냅샷 읽기현재 읽기 두 가지 유형으로 나눌 수 있기 때문입니다. 일반 쿼리 문만 스냅샷 읽기이고, 나머지 추가, 삭제, 수정, 공유 모드 공유 잠금이나 업데이트 전용 잠금이 있는 쿼리 문은 모두 현재 읽기입니다. 이때 읽는 것은 최신 데이터입니다. . 및 스냅샷 읽기가 반드시 최신 데이터를 읽는 것은 아닙니다.

다음에서 추론할 수 있습니다. 세션 A에서 조건 이름=John으로 업데이트 또는 삭제하는 경우 아래와 같이 업데이트 또는 삭제가 확실히 성공하지 못할 것입니다.

mysql> update inno_tbl set name='张三' where name='John';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
mysql> delete from inno_tbl where name='John';
Query OK, 0 rows affected (0.00 sec)
로그인 후 복사

격리 수준이 Read Committed로 변경되면 그러면 세션 A의 쿼리 문은 공유 모드에서 잠금을 추가하거나 업데이트하지 않고 세션 B에서 변경 및 제출된 최신 콘텐츠를 쿼리할 수 있습니다. 이러한 상황을 반복 불가능한 읽기라고 합니다. 이 글을 쓰면서 궁금한 점이 있습니다. 비반복 읽기환상 읽기는 서로 모순되는 것인가요? 답변: 아니요, 비반복 읽기는 주로 수정을 위한 것이고, 환상 읽기는 주로 삽입 및 삭제를 위한 것입니다.

위 내용은 Mysql Innodb 트랜잭션 격리 수준이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿