1. 트랜잭션이란 무엇입니까?
트랜잭션은 하나 이상의 데이터베이스 작업문의 조합이며
원자성입니다. (원자성)
모두 성공하거나 모두 취소됩니다.
Consistency(일관성)
데이터베이스 상태가 올바르게 변경된 후에는 데이터베이스의 일관성 제약 조건을 위반하지 않습니다.
격리
거래는 서로 독립적이며 간섭하지 않습니다.
기간(지속성)
거래 제출 결과는 데이터베이스에 유지됩니다.
2. 트랜잭션 동시성으로 인한 문제
트랜잭션 격리가 없으면 발생할 수 있습니다:
Dirty read
더티 읽기(Dirty Reading)는 트랜잭션이 데이터를 읽고 데이터를 수정했지만 아직 제출되지 않은 경우 다른 트랜잭션도 데이터를 읽은 다음 데이터를 사용하는 것을 의미합니다. 예를 들어 사용자의 계좌 금액이 100인데 T1이 200으로 수정했지만 제출하지 않았습니다. 동시에 T2는 사용자의 계좌 금액이 200이라는 것을 읽은 다음 T1이 비정상적으로 롤백하고 T2가 200을 읽습니다. 더러운 데이터입니다.
반복 불가능한 읽기
반복 불가능한 읽기는 데이터베이스의 특정 데이터 부분에 대해 트랜잭션 내의 여러 쿼리가 반환되는 것을 의미합니다. 값이 다릅니다. 이는 쿼리 간격 동안 다른 트랜잭션에 의해 수정 및 커밋되었기 때문입니다.
환상 읽기
트랜잭션의 두 쿼리에서 데이터 행 수가 일치하지 않습니다. 예를 들어, 한 트랜잭션이 여러 데이터 열을 쿼리하고 다른 트랜잭션이 이때 여러 개의 새로운 데이터 열을 삽입하면 다음 쿼리에서 첫 번째 트랜잭션은 마치 이전에 없었던 여러 데이터 열이 있음을 발견하게 됩니다. 그것은 환상이었습니다. 이것은 유령 읽기가 일어나는 것입니다.
3. 트랜잭션 격리 수준
트랜잭션 격리 수준은 어떤 동시성 문제를 해결합니까?
1. 커밋되지 않은 읽기(커밋되지 않은 콘텐츠 읽기)
이것은 트랜잭션의 가장 낮은 격리 수준으로, 다른 트랜잭션에서 이 트랜잭션의 커밋되지 않은 데이터를 볼 수 있습니다. . 동시성 문제를 피할 수 있는 방법은 없습니다.
2. Read Committed(제출 내용 읽기)
한 트랜잭션에 의해 수정된 데이터는 다른 트랜잭션, 즉 다른 트랜잭션에서만 읽을 수 있도록 보장합니다. 트랜잭션 트랜잭션은 트랜잭션에 의해 커밋되지 않은 데이터를 읽을 수 없습니다. 더티 읽기(Dirty Read)는 방지할 수 있지만 반복 불가능한 읽기 및 팬텀 읽기(Phantom Read)가 발생할 수 있습니다.
3. 반복 읽기(재읽기)
이것은 동일한 트랜잭션의 여러 인스턴스를 동시에 읽을 수 있도록 보장하는 MySQL의 기본 트랜잭션 격리 수준입니다. 데이터를 사용하면 동일한 데이터가 표시됩니다. 더티 읽기(Dirty Read)와 반복 불가능한 읽기는 방지할 수 있지만 팬텀 읽기(Phantom Read)가 발생할 수 있습니다.
4. 직렬화 가능(직렬화 가능)
이것은 트랜잭션을 강제로 주문하여 서로 충돌하는 것을 불가능하게 하는 가장 높은 격리 수준입니다. 다른. 이 수준에서는 많은 시간 초과와 잠금 경합이 발생할 수 있습니다. 더티 읽기, 반복 불가능한 읽기 및 팬텀 읽기의 발생을 방지할 수 있습니다.
다음 글에서는 InnoDB 엔진의 잠금 메커니즘을 소개합니다.
위 내용은 MySQL 트랜잭션, 잠금 및 애플리케이션 내용입니다(1). 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!