Innodb의 트랜잭션 격리 수준
5140 단어 innodbisolationtransactionmysql
I
이며, 격리는 하나가 다른 트랜잭션에 영향을 미치지 않는 방식으로 여러 트랜잭션을 동시에 처리하는 기능을 나타냅니다. 마지막으로 Innodb은 Mysql의 기본값storage-engine입니다. 이 기사에서는 MySQL-InnoDB에서 사용할 수 있는 다양한 격리 수준을 이해할 것입니다.mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.02 sec)
격리 수준은 모든 세션에 대해 설정할 수 있습니다. 즉, 전역으로 설정하거나 세션별로 설정할 수 있습니다. 기본 트랜잭션 격리 수준은
REPEATABLE-READ
입니다.MySQL에는 4가지 수준의 트랜잭션 격리가 있습니다.
READ-UNCOMMITTED: 이름에서 알 수 있듯이 트랜잭션은 더티 읽기로 이어지는 데이터베이스에 커밋되지 않은 데이터를 읽을 수 있습니다.
위의 예에서 우리는 2개의 세션을 시작하고 두 세션 모두에서 격리 수준을
READ-UNCOMMITTED
로 설정했으며 세션 1에서 세션 2에 의해 커밋되지 않은 데이터를 읽을 수 있음을 알 수 있습니다.READ-COMMITTED: 이 수준에서는 커밋된 데이터만 select에서 읽을 수 있기 때문에 더티 읽기가 불가능하지만 각 후속 읽기는
non-repeatable
일 수 있습니다. 이해를 돕기 위해 예를 들어 보겠습니다.위의 예에서 커밋된 쓰기만 선택되어 더티 읽기 문제가 해결되었지만 다른 트랜잭션이 커밋되면 각 읽기 결과가 달라지므로
non-repeatable
읽기가 발생합니다.REPEATABLE-READ: Innodb의 기본 트랜잭션 격리 수준입니다. 이 격리 수준에서 select는 첫 번째 실행
SELECT
의 스냅샷과 동일한 값을 생성하고 트랜잭션이 끝날 때까지 사용됩니다. 이렇게 하면 더티 읽기 및 반복 불가능한 읽기가 모두 처리되지만 반복 읽기 격리 수준phantom rows을 얻을 수 있습니다.위의 예에서 우리는 두 세션 모두에서 트랜잭션을 시작했으며 쓰기가 데이터베이스에 커밋된 경우에도 트랜잭션 1의 모든 읽기가 여전히 동일한 결과를 생성한다는 것을 알 수 있습니다.
위의 예에서 트랜잭션 1에
phantom-row
인 1개의 새 행이 있음을 알 수 있습니다.SERIALIZABLE: 이 격리 수준은 가능한 가장 강력한 격리 수준이지만 잠금 조건의 기회도 증가시킵니다. 이는 공유 읽기 잠금과 배타적 쓰기 잠금을 사용하여 수행됩니다. SERIALIZABLE은 첫 번째 트랜잭션이 완료될 때까지 한 트랜잭션에서 선택한 행을 다른 트랜잭션에서 변경할 수 없다는 추가 제한이 있는 REPEATABLE READ와 유사합니다. 예를 보겠습니다.
위의 예에서 다른 트랜잭션에 새 행을 삽입하려고 하면
Lock wait timeout exceeded
오류가 발생하는 것을 볼 수 있습니다. 이것은 팬텀 행에서 수정을 보장합니다.4가지 트랜잭션 격리 수준이 모두 예제와 함께 설명되어 있습니다. 우리는 또한 격리 수준이 일관성과 처리량 사이의 균형임을 확인했습니다. 높은 일관성(SERIALIZABLE)은 더 많은 잠금 조건/더 적은 처리량을 의미하며 그 반대의 경우도 마찬가지입니다.
자세한 내용을 보려면 다음 사이트를 방문하십시오. https://buildatscale.tech/transaction-isolation-level-in-innodb/
Reference
이 문제에 관하여(Innodb의 트랜잭션 격리 수준), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rahul91/transaction-isolation-levels-in-innodb-okb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)