>  기사  >  데이터 베이스  >  MySQL 데이터베이스 최적화(2)—MySQL 트랜잭션

MySQL 데이터베이스 최적화(2)—MySQL 트랜잭션

黄舟
黄舟원래의
2017-02-27 13:41:521242검색

1. ACID
원자성
원자성: 트랜잭션은 분할할 수 없는 최소 작업 단위로 간주되며 전체 트랜잭션은 모두 실행하거나, 모두 실패하면 롤백합니다.
일관성
일관성: 데이터베이스는 항상 하나의 일관된 상태에서 다른 일관된 상태로 전환됩니다. 예를 들어, 자금 인출 작업이 실패하더라도 해당 트랜잭션이 커밋되지 않았기 때문에 해당 트랜잭션에 대한 수정 사항은 데이터베이스에 저장되지 않으며 데이터는 여전히 트랜잭션이 실행되기 전의 상태로 유지됩니다. 트랜잭션이 성공적으로 실행되면 실행 후에도 데이터는 변경되지 않습니다.
격리
격리: 한 트랜잭션에서 수정한 사항은 커밋되기 전에 다른 트랜잭션에 표시되지 않습니다.
내구성
내구성: 트랜잭션이 커밋되면 수정 사항이 데이터베이스에 영구적으로 저장됩니다.

참고

잠금 세분성 업그레이드가 시스템 오버헤드를 증가시키는 것처럼 트랜잭션 처리에도 데이터베이스 시스템이 더 많은 추가 작업을 수행해야 합니다. ACID를 지원하는 DB는 일반적으로 ACID를 지원할 필요가 없는 데이터베이스에 비해 더 높은 CPU 처리 능력이 필요하고 더 많은 메모리와 디스크 공간이 필요합니다. 따라서 사용자는 다양한 애플리케이션 시나리오를 통해 MySQL의 다양한 데이터베이스 엔진을 선택하고 유연성을 가질 수 있습니다.

2. 격리 수준
SQL 표준에는 4가지 격리 수준이 정의되어 있습니다. 트랜잭션 격리의 각 수준은 트랜잭션 내부 및 트랜잭션 간의 수정 사항에 대한 가시성에 해당합니다. 격리 수준이 낮을수록 동시성은 더 강력해지고 시스템 오버헤드는 낮아집니다.
커밋되지 않은 읽기
커밋되지 않은 읽기: 이 격리 수준의 트랜잭션의 경우 데이터 수정 프로세스 중에 커밋되지 않은 경우에도 다른 트랜잭션이 계속 데이터를 읽을 수 있습니다. 커밋되지 않은 데이터를 읽을 수 있는 트랜잭션을 더티 읽기(dirty read)라고도 합니다. 더티 읽기는 실제 애플리케이션에서 많은 문제를 일으킬 수 있으므로 일반적으로 이 격리 수준은 거의 사용되지 않습니다.
Read Committed
Committed read: (일반 데이터베이스 기본 트랜잭션 수준) 현재 트랜잭션이 실행되고 데이터가 제출된 후에만 다른 트랜잭션에서 데이터를 읽을 수 있습니다. 다른 트랜잭션에 의해 실행된 두 개의 서로 다른 쿼리로 인해 두 개의 서로 다른 결과가 발생할 수 있기 때문에 이를 반복 불가능 읽기라고도 합니다(트랜잭션이 실행되기 전에 한 번, 트랜잭션이 실행된 후에 한 번 읽음).
반복 읽기
반복 읽기: (Mysql의 기본 격리 수준) 이 수준은 동일한 트랜잭션에서 여러 읽기 결과의 일관성을 보장합니다. 그러나 환상 읽기 문제는 여전히 해결되지 않습니다. 팬텀 읽기: 트랜잭션 A가 특정 범위의 데이터를 읽으면 트랜잭션 B가 데이터 범위에 대해 삽입 및 기타 업데이트 작업을 수행합니다. 트랜잭션 A가 해당 범위의 레코드를 다시 읽으면 팬텀 읽기가 발생합니다.
직렬화 가능

직렬화 가능: 각 데이터 행을 읽을 때 팬텀 읽기 문제를 방지하기 위해 트랜잭션이 직렬로 실행되도록 잠금이 추가됩니다. 그러나 시간 초과가 발생하고 경쟁 문제가 발생하기 쉽습니다. 응용 프로그램도 비교적 적으며 이 수준은 데이터 일관성이 있고 동시성이 특별히 필요하지 않은 경우에만 사용됩니다.

3. Mysql은 트랜잭션 격리 수준을 설정합니다.

트랜잭션 격리 수준을 설정합니다.
새로운 격리 레벨은 다음 트랜잭션 실행이 시작될 때 적용됩니다. 현재 트랜잭션의 격리 수준을 수정해야 하는 경우 구성 파일을 수정할 수 있습니다. 또한, 이전 블로그에서는 mysql에서 제공하는 트랜잭션을 지원하는 두 가지 스토리지 엔진인 InnoDB와 NDB Cluster를 소개했습니다.

위는 MySQL 데이터베이스 최적화(2) - MySQL 트랜잭션 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.