Innodb의 트랜잭션 격리 수준

먼저 제목부터 살펴보겠습니다. 트랜잭션은 커밋하거나 롤백할 수 있는 단일 작업 단위로 수행되는 명령문, 쿼리 또는 작업의 순차적인 그룹입니다. 다음으로 격리는 ACID 속성 중 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/

좋은 웹페이지 즐겨찾기