>  기사  >  데이터 베이스  >  Mysql Innodb 트랜잭션 격리 수준이란 무엇입니까?

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

青灯夜游
青灯夜游앞으로
2019-02-26 11:19:011858검색

이 기사에서는 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으로 문의하시기 바랍니다. 삭제